A menudo uso el excelente programa find en Bash para listar archivos con ciertos filtros. Por ejemplo, en un Subversion (SVN) copia de trabajo, a veces me gustaría hacer una lista recursivamente todos los archivos pero excluyendo los .svn
subdirectorios de la siguiente manera:Comando Bash para enumerar recursivamente archivos, pero clasificándolos por clasificación
find . -name '.svn' -prune -o -type f -print
Hoy en día, lo que quería hacer algo similar, pero también quería afectar el orden en que se enumeraron los contenidos del directorio: quería que los archivos "ordinarios" fueran seguidos por subdirectorios (y luego por los contenidos recursivos). No parece haber una opción para esto.
El comando ls (lista) tiene una opción para enumerar recursivamente. Este comando tiene muchas opciones de clasificación, incluida la lista por nombre de archivo, tiempo de acceso, tamaño, etc., pero no clasificación, aunque la opción -p
hará anotaciones en los directorios.
Ahora, I podría escribir, por ejemplo, una secuencia de comandos de Python para hacer exactamente lo que quiero. Sin embargo, find
ya hace casi todo lo que quiero. Por lo general dentro de un shell Bash, es posible combinar programas para hacer justo lo que desea: cada programa, como find
, sort
, uniq
, ls
, wc
, realiza una tarea simple, pero lo hace muy bien. No todos los programas deben poder ordenar porque sort
puede ordenar. Entonces, realmente, solo tengo curiosidad ...
Mi pregunta es, ¿sabes si hay una manera de hacer lo que quiero: filtrar y ordenar una lista de archivos recursivos, simplemente combinando programas Bash?
Por ejemplo, find
me da los archivos de este, alfabético, orden:
a.txt
b\file1.txt
b\subdir\file2.txt
b\then_file3.txt
c.txt
d\file4.txt
e.txt
pero preferiría en este orden, en donde dentro de cada directorio, están ordenados alfabéticamente primero los archivos ordinarios, seguido por los directorios, de nuevo alfabéticamente:
a.txt
c.txt
e.txt
b\file1.txt
b\then_file3.txt
b\subdir\file2.txt
d\file4.txt
(yo soy un usuario de Windows, pero ejecutar un intérprete de comandos en Cygwin.)
Gracias.
Esto funciona, pero emite advertencias. Se pueden desactivar con la opción '-nowarn'. –
¡Gracias! Pensé que probablemente sería posible de alguna manera. Por lo tanto, mi ejemplo de filtrado SVN sería buscar. -name '.svn' -prune -o -type d -exec find {} -type f -nowarn -maxdepth 1 \; – Rhubbarb
Cuando pruebo esto, el resultado no está ordenado (por dir y dentro de niveles de dir). –