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:
find
encuentra archivos (obviamente).
es el directorio actual, que después decd
is/tmp
(en mi humilde opinión esto es más flexible que tener/tmp
directamente en elfind
comando. Solo tiene un lugar, elcd
, para cambiar, si desea que se realicen más acciones en esta carpeta)-maxdepth 1
y-mindepth 1
asegúrese de quefind
solo se vea en el directorio actual y no se incluya.
en el resultado-type d
busca solo directorios-printf '%f\n
imprime solo el nombre de la carpeta encontrada (más una nueva línea) para cada hit.Et voilà!
fuente
while..done
bucle puede volverse loco.find
La-exec
opció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
find
cuando puedes agregar una barra a un comodín?for dir in */; do echo $dir; done
es 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
find
comando.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
-print0
opción termina con un carácter NULL en lugar de un espacio. La-0
opció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
find
y pegándola al final de unchmod
comando.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 separadostuff
se 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 1
fuente
Si desea ejecutar múltiples comandos en un bucle for, puede guardar el resultado de
find
withmapfile
(bash> = 4) como una variable y recorrer la matriz con${dirlist[@]}
. También funciona con directorios que contienen espacios.El
find
comando se basa en la respuesta de Boldewyn. Sefind
puede encontrar más información sobre el comando allí.fuente