Uso de patrones OR en comodines de shell

52

Los contenidos de mi directorio son

$ ls -lrt
total 0
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 noon.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

Me gustaría enumerar los detalles de los archivos que tienen una palabra en el nombre del archivo como se especifica.

Ejemplo:

$ ls -lrt *day|night*
ls: *day: No such file or directory
bash: night.txt: command not found

Rendimiento esperado

-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

Cómo enumerar diferentes archivos que coinciden con 2 patrones diferentes, o en resumen, cómo usar regex con ls, para que pueda ver ORlas partes del nombre de archivo.

Escenario original, hay muchos archivos en el directorio, han acortado el caso para preguntar.

mtk
fuente

Respuestas:

65

Ni siquiera necesita un globbing extendido habilitado para hacer lo que quiere. Esto funcionará en bash:

ls {day*,night*}
itsbruce
fuente
77
No, no lo hace: touch day.txt; touch night.txt; ls {*day,night*}resultadosls: *day: No such file or directory
Matteo
1
Estaba adaptando el texto del póster original; Pensé que eso estaba claro. suspiro . Texto actualizado. ¿Seguramente puedes ver que el mecanismo funciona?
itsbruce
77
O posiblemente *{day,night}*esté más cerca de lo que quiere el OP.
derobert
25

No hay ninguna opción lspara filtrar el nombre del archivo, pero en la mayoría de los shells hay una extensión globalman bash /Pattern Matching

ksh

ls -lrtd -- *@(day|night)*

zsh

setopt extendedglob
ls -lrtd -- *(day|night)*

o:

setopt kshglob
ls -lrtd -- *@(day|night)*

golpetazo

shopt -s extglob
ls -lrtd -- *@(day|night)*

En cualquiera de estos tres shells puede hacer esto, pero tenga en cuenta que si uno de los casos no coincide con ningún archivo, ese patrón se dejará sin expandir (por ejemplo, *day* night1.txt othernight.txtsi no hay ningún nombre de archivo que contenga day; vea man bash /EXPANSIONo /Brace Expansionespecíficamente):

ls -lrtd -- *{day,night}*

En cualquier caparazón puedes hacer:

ls -lrtd -- *day* *night*

En zsh, si hay tampoco ninguna dayo nightarchivo, los dos últimos comandos fallará; establezca la opción nonomatcho csh_null_glob, o agregue (N)después de cada patrón para evitar esto.

Nahuel Fouilleul
fuente
1
¿Qué pasa con *{day,night}*. Lo editaría, pero no sé qué shells lo admiten.
Random832
@ Random832 Funciona en bash, kshy zsh(ninguno necesita globing extendido), pero no sh; sin embargo, el último ejemplo de "todos los proyectiles" de Nahuel funciona sh.
Izkata
14

Los shells no usan expresiones regulares para la expansión de argumentos.

Puede habilitar la coincidencia de patrones extendidos mediante

$ shopt -s extglob

y entonces

$ ls @(day|night).txt
day.txt   night.txt

Consulte, por ejemplo, el Manual de referencia de Bash (coincidencia de patrones)

Matteo
fuente