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.

Respuestas:


65

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

ls {day*,night*}

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.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.