Estoy escribiendo un script en bash en Linux y necesito revisar todos los nombres de subdirectorios en un directorio dado. ¿Cómo puedo recorrer estos directorios (y omitir archivos normales)?
Por ejemplo:
el directorio dado /tmp/
tiene los siguientes subdirectorios:/tmp/A, /tmp/B, /tmp/C
Quiero recuperar A, B, C.

Respuestas:
Una breve explicación:
findencuentra archivos (obviamente).es el directorio actual, que después decdis/tmp(en mi humilde opinión esto es más flexible que tener/tmpdirectamente en elfindcomando. Solo tiene un lugar, elcd, para cambiar, si desea que se realicen más acciones en esta carpeta)-maxdepth 1y-mindepth 1asegúrese de quefindsolo se vea en el directorio actual y no se incluya.en el resultado-type dbusca solo directorios-printf '%f\nimprime solo el nombre de la carpeta encontrada (más una nueva línea) para cada hit.Et voilà!
fuente
while..donebucle puede volverse loco.findLa-execopción 'le permite ejecutar cualquier comando para cada archivo / directorio.Todas las respuestas hasta ahora se usan
find, así que aquí hay una con solo el shell. No necesita herramientas externas en su caso:fuente
findcuando puedes agregar una barra a un comodín?for dir in */; do echo $dir; donees para los directorios en el directorio actual.dir=${dir%*/}yecho ${dir##*/}lo está haciendo./tmp/*/, sería conveniente incluir una verificación para ver si el directorio realmente existe.Puede recorrer todos los directorios, incluidos los directorios ocultos (comenzando con un punto) con:
nota: el uso de la lista
*/ .*/funciona en zsh solo si existe al menos un directorio oculto en la carpeta. En bash se mostrará también.y..Otra posibilidad para que bash incluya directorios ocultos sería usar:
Si desea excluir enlaces simbólicos:
Para generar solo el nombre del directorio final (A, B, C como se cuestionó) en cada solución, use esto dentro de los bucles:
Ejemplo (esto también funciona con directorios que contienen espacios):
fuente
Funciona con directorios que contienen espacios.
Inspirado por Sorpigal
Publicación original (no funciona con espacios)
Inspirado por Boldewyn : Ejemplo de bucle con
findcomando.fuente
fuente
basename. Preferiría esto sobre mi respuesta.La técnica que uso con más frecuencia es
find | xargs. Por ejemplo, si desea que todos los archivos de este directorio y todos sus subdirectorios sean legibles en todo el mundo, puede hacer lo siguiente:La
-print0opción termina con un carácter NULL en lugar de un espacio. La-0opción divide su entrada de la misma manera. Entonces esta es la combinación para usar en archivos con espacios.Puede imaginar esta cadena de comandos tomando cada salida de línea
findy pegándola al final de unchmodcomando.Si el comando que desea ejecutar como argumento en el medio en lugar de al final, debe ser un poco creativo. Por ejemplo, necesitaba cambiar a cada subdirectorio y ejecutar el comando
latemk -c. Entonces usé (de Wikipedia ):Esto tiene el efecto de
for dir $(subdirs); do stuff; done, pero es seguro para directorios con espacios en sus nombres. Además, las llamadas por separadostuffse realizan en el mismo shell, por lo que en mi comando tenemos que volver al directorio actual conpopd.fuente
un bucle bash mínimo del que puede construir (basado en la respuesta ghostdog74)
comprimir un montón de archivos por directorio
fuente
directory, no solo los subdirectorios.find . -type d -maxdepth 1fuente
Si desea ejecutar múltiples comandos en un bucle for, puede guardar el resultado de
findwithmapfile(bash> = 4) como una variable y recorrer la matriz con${dirlist[@]}. También funciona con directorios que contienen espacios.El
findcomando se basa en la respuesta de Boldewyn. Sefindpuede encontrar más información sobre el comando allí.fuente