Cómo mostrar una lista ordenada de archivos que contiene cierta cadena en la terminal de Linux

Cómo mostrar una lista ordenada de archivos que contiene cierta cadena en la terminal de Linux

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, test2etc. test3, que contienen la cadena hellode alguna manera. Puede ser simplemente hello, puede ser, helloJASKFNASKFNetc.

¿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 grepo findpara 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 helloen el contenido de archivos cuyo nombre va testseguido 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 qualifiersla lista de calificadores globales y la lista de criterios opor los que el calificador puede ordenar.

Reemplace ocon Opara invertir el orden ( Onpara ordenar al revés por nombre).

Úselo (.n)para que la clasificación por nombre sea numérica ( test10después de test9, no entre test1y 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 -Vopción sortpara 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 -rpara sortpara invertir el orden.

información relacionada