2009-11-05 24 views
7

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.

Respuesta

10

Utilice un hallazgo incrustado. El hallazgo exterior localiza todos los directorios y ejecuta un descubrimiento interior que muestra sólo los archivos que desea en ese directorio:

find . -type d -exec find {} -type f -maxdepth 1 \; 
+1

Esto funciona, pero emite advertencias. Se pueden desactivar con la opción '-nowarn'. –

+0

¡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

+1

Cuando pruebo esto, el resultado no está ordenado (por dir y dentro de niveles de dir). –

1
tree -fi 

En Ubuntu y CentOS (y Red Hat, Fedora ...) que está contenida en su propio paquete, llamado "árbol" (duh). Ubuntu no parece instalar ese paquete de forma predeterminada, los demás lo hacen.

EDITAR: Disculpe, no me di cuenta de que está usando Cygwin. Bueno, también se transfiere a Cygwin. Si no está en el conjunto predeterminado, see here.

+0

También puede agregar un '-a para obtener los archivos ocultos. –

0

No indicó cómo quería manejar las cosas si los directorios tienen más de un nivel de profundidad. ¿Algo como esto hace lo que estás buscando?Se hace un listado en amplitud, ordenados dentro de cada nivel de profundidad:

$for ((l = 0; l <= 24; l++)); do find . -mindepth ${l} -maxdepth ${l} -type f | sort; done 
+0

Eso fue difícil de expresar, así que traté de ilustrarlo en el ejemplo. Yo * no * quiero todos los archivos, y luego todos los directorios (eso es fácil). Mientras estoy en un directorio determinado, primero quiero enumerar los archivos, y luego procesar cada subdirectorio, recurriendo a cada uno por turno. – Rhubbarb

2

Esto agrupa los directorios dentro de cada nivel primero, luego los archivos y recursivamente en cada nivel y hace lo mismo:

ls -lR --group-directories-first 

Sin embargo, está al revés de lo que querías.

Cuestiones relacionadas