Supongamos que tengo 3 carpetas en diferentes directorios, algunas de ellas contienen más subcarpetas, y en cada carpeta/subcarpeta tengo archivos de texto llamados test1
, test2
etc. test3
, que contienen la cadena hello
de alguna manera. Puede ser simplemente hello
, puede ser, helloJASKFNASKFN
etc.
¿Cómo puedo mostrar una lista ordenada de esos archivos? Digamos que quiero ordenar por sus nombres o por la fecha de modificación. Entiendo que puedo usar el comando grep
o find
para buscar y mostrar esos archivos, pero no estoy seguro de cómo puedo mostrarlos ordenados.
Respuesta1
Es más fácil si primero ordena la lista de archivos antes de pasarla a grep
:
En zsh
, puedes hacer:
grep -le hello -- **/test<->(.)
Que busca hello
en el contenido de archivos cuyo nombre va test
seguido de uno o más dígitos decimales ( <->
siendo una forma del <x-y>
patrón para hacer coincidir rangos de números), dentro o debajo del directorio de trabajo actual, omitiendo directorios ocultos.
Las expansiones globales de forma predeterminada están ordenadas por nombre.
Para ordenar por hora de modificación, utilice (.om)
en lugar de (.)
. o (.oL)
por tamaño. Consulte info zsh qualifiers
la lista de calificadores globales y la lista de criterios o
por los que el calificador puede ordenar.
Reemplace o
con O
para invertir el orden ( On
para ordenar al revés por nombre).
Úselo (.n)
para que la clasificación por nombre sea numérica ( test10
después de test9
, no entre test1
y test2
).
Si te topas con unDemasiados argumentoserror (causado por una limitación de la execve()
llamada al sistema de la mayoría de los sistemas):
autoload -Uz zargs # best in ~/.zshrc
zargs -- **/test<->(.) -- grep -le hello --
Con herramientas GNU y cualquier shell (excepto (t)csh donde necesitarías poner el comando en una línea):
Para ordenar por nombre:
LC_ALL=C find . -regextype posix-extended -name '.?*' -prune -o \
-regex '.*/test[0-9]+' -type f -print0 |
sort -z |
xargs -r0 grep -le hello --
(agregue la -V
opción sort
para una clasificación numérica)
Para ordenar por hora de modificación:
LC_ALL=C find . -regextype posix-extended -name '.?*' -prune -o \
-regex '.*/test[0-9]+' -type f -printf '%T@\t%p\0' |
sort -zrn |
cut -zf2- |
xargs -r0 grep -le hello --
Agregar/eliminar -r
para sort
para invertir el orden.