Tengo una carpeta con algunos directorios y algunos archivos (algunos están ocultos, comenzando con punto).
for d in *; do
echo $d
done
recorrerá todos los archivos, pero quiero recorrer solo los directorios. ¿Cómo puedo hacer eso?
Puede especificar una barra diagonal al final para que coincida solo con los directorios:
for d in */ ; do
echo "$d"
done
[[ -L $d ]]si $ d es un enlace simbólico.set -Psolo afecta a los comandos que cambian de directorio. sprunge.us/TNac[[ -L "$f" ]]no excluirá los enlaces simbólicos en este caso con*/, debe quitar la barra inclinada final[[ -L "${f%/}" ]](vea Prueba para el enlace con la barra inclinada final )Puedes probar con
-d:Este es uno de los operadores de prueba de archivos .
fuente
if [[ -d "$f" && ! -L "$f" ]]excluirá enlaces simbólicosif [[ "$f" = "*" ]]; then continue; fiTenga en cuenta que la solución de choroba, aunque elegante, puede provocar un comportamiento inesperado si no hay directorios disponibles dentro del directorio actual. En este estado, en lugar de omitir el
forciclo, bash ejecutará el ciclo exactamente una vez dondedes igual a*/:Recomiendo usar lo siguiente para protegerse contra este caso:
Este código recorrerá todos los archivos en el directorio actual, verificará si
fes un directorio, luego hará ecofsi la condición devuelve verdadero. Sifes igual a*/,echo $fno se ejecutará.fuente
shopt -s nullglob.Si necesita seleccionar archivos más específicos que solo los directorios usan
findy pasarlos awhile read:Se usa
shopt -u dotglobpara excluir directorios ocultos (osetopt dotglob/unsetopt dotgloben zsh).IFS=para evitar dividir nombres de archivo que contengan uno de los siguientes$IFS, por ejemplo:'a b'vea la respuesta de AsymLabs a continuación para más
findopcioneseditar:
en caso de que necesite crear un valor de salida desde el ciclo while, puede eludir la subshell adicional con este truco:
fuente
Puedes usar pure bash para eso, pero es mejor usar find:
(Encontrar adicionalmente incluirá directorios ocultos)
fuente
shopt -s dotglobparabashincluir directorios ocultos. El tuyo también incluirá.. También tenga en cuenta que-maxdepthno es una opción estándar (-prunees).dotglobopción es interesante perodotglobsolo se aplica al uso de*.find .siempre incluirá directorios ocultos (y el directorio actual también)Esto se hace para encontrar directorios visibles y ocultos dentro del directorio de trabajo actual, excluyendo el directorio raíz:
simplemente recorrer los directorios:
para incluir enlaces simbólicos en el resultado:
hacer algo a cada directorio (excluyendo enlaces simbólicos):
para excluir directorios ocultos:
para ejecutar múltiples comandos en los valores devueltos (un ejemplo muy artificial):
en lugar de 'sh -c' también puede usar 'bash -c', etc.
fuente
... -print0 | xargs -0 ...si no sabe cuáles son los nombres exactos.find * | while read file; do ...Puede recorrer todos los directorios, incluidos los directorios ocultos (comenzando con un punto) en una línea y múltiples comandos con:
Si desea excluir enlaces simbólicos:
nota: el uso de la lista
*/ .*/funciona en bash, pero también muestra las carpetas.y..mientras está en zsh no las mostrará, pero arrojará un error si no hay ningún archivo oculto en la carpetaUna versión más limpia que incluirá directorios ocultos y excluirá ../ estará con la opción dotglob:
(o
setopt dotgloben zsh)puedes desarmar dotglob con
fuente
Esto incluirá la ruta completa en cada directorio de la lista:
fuente
Use
findcon-execpara recorrer los directorios y llamar a una función en la opción exec:Use
shopt -s dotgloboshopt -u dotglobpara incluir / excluir directorios ocultosfuente
Esto enumera todos los directorios junto con el número de subdirectorios en una ruta determinada:
fuente
fuente
Thisisonedirectorywithspacesinthename- pero se analiza como múltiple.o:
Puedes configurarlo como un alias
fuente
lsrespuesta basada en la lista , que enumera los directorios.ls: mywiki.wooledge.org/ParsingLs