
Le he dado el comando:
ls -lrt
y los archivos y directorios enumerados son:
drwxr-xr-x 4 root root 4096 Feb 2 2014 abc
drwxr-xr-x 4 root root 4096 Feb 2 2014 cde
drwxr-xr-x 4 root root 4096 Feb 2 2014 efg
-rwxr-xr-x 4 root root 4096 Feb 2 2014 aaa.txt
Ahora quiero saber si los archivos de salida enumerados son directorios o no usando el bucle for o el bucle while.
Respuesta1
Con ls
, use el siguiente comando para enumerar solo directorios.
ls -d -- */
Para enumerar archivos normales usando el propio ls (y asumiendo que los nombres de los archivos no contienen caracteres de nueva línea), puede usar el siguiente comando.
ls -p | grep -v /
Para enumerar sólo los archivos normales, con GNU y algunas otras implementaciones de búsqueda, puede utilizar
find . -maxdepth 1 -type f
(tenga en cuenta que al contrario del anterior, también incluye archivos ocultos y la lista no está ordenada)
El equivalente estándar sería:
find . ! -name . -prune -type f
Respuesta2
Si desea tener algo así como una "plantilla de script de shell" sobre cómo recorrer el contenido del directorio y realizar acciones según el tipo de archivo, lo siguiente podría darle una pista:
for f in *
do
if [[ -d "$f" ]]
then
... your processing of directories here, reference them as "$f" ...
fi
done
Esto revisará todas las entradas en el directorio actual, verificará si son directorios y realizará cualquier procesamiento que desee en ellos. Tenga en cuenta que la sintaxis de la prueba de directorio es específica de BASH; para el caso general, utilice if [ -d "$f" ]
.
Otro enfoque restringiría la lista solo a entradas del directorio:
for d in */
do
... whatever you need to do on directory "$d" ...
done
Respuesta3
No necesitarías un bucle para encontrar todos los directorios, puedes usar el find
comando en su lugar:
find . -maxdepth 1 -type d
Esto enumerará todos los directorios en el directorio actual. Si quieres el ls -l
resultado puedes hacer:
find . -maxdepth 1 -type d | xargs ls -ld
Si realmente desea utilizar un bucle, puede utilizar la siguiente construcción:
for file in $(ls)
do
if [[ -d $file ]]
then
ls -ld $file
fi
done
El for
bucle recorre todas las entradas devueltas por ls
y luego if
prueba si la entrada es un directorio.
Respuesta4
enumerar nombres de directorios
compgen -d
No partir de un punto
compgen -d -X '.*' | xargs ls -dlrt