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 -P
solo 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; fi
Tenga 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
for
ciclo, bash ejecutará el ciclo exactamente una vez donded
es igual a*/
:Recomiendo usar lo siguiente para protegerse contra este caso:
Este código recorrerá todos los archivos en el directorio actual, verificará si
f
es un directorio, luego hará ecof
si la condición devuelve verdadero. Sif
es igual a*/
,echo $f
no se ejecutará.fuente
shopt -s nullglob
.Si necesita seleccionar archivos más específicos que solo los directorios usan
find
y pasarlos awhile read
:Se usa
shopt -u dotglob
para excluir directorios ocultos (osetopt dotglob
/unsetopt dotglob
en 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
find
opcioneseditar:
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 dotglob
parabash
incluir directorios ocultos. El tuyo también incluirá.
. También tenga en cuenta que-maxdepth
no es una opción estándar (-prune
es).dotglob
opción es interesante perodotglob
solo 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 dotglob
en zsh)puedes desarmar dotglob con
fuente
Esto incluirá la ruta completa en cada directorio de la lista:
fuente
Use
find
con-exec
para recorrer los directorios y llamar a una función en la opción exec:Use
shopt -s dotglob
oshopt -u dotglob
para incluir / excluir directorios ocultosfuente
Esto enumera todos los directorios junto con el número de subdirectorios en una ruta determinada:
fuente
fuente
This
is
one
directory
with
spaces
in
the
name
- pero se analiza como múltiple.o:
Puedes configurarlo como un alias
fuente
ls
respuesta basada en la lista , que enumera los directorios.ls
: mywiki.wooledge.org/ParsingLs