Bucle de los archivos de listado en UNIX

Bucle de los archivos de listado en UNIX

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 findcomando en su lugar:

find . -maxdepth 1 -type d

Esto enumerará todos los directorios en el directorio actual. Si quieres el ls -lresultado 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 forbucle recorre todas las entradas devueltas por lsy luego ifprueba si la entrada es un directorio.

Respuesta4

enumerar nombres de directorios

compgen -d

No partir de un punto

compgen -d -X '.*' | xargs ls -dlrt

información relacionada