¿Cómo capturo la salida del comando ls o find para almacenar todos los nombres de archivo en una matriz?


Necesita procesar los archivos en el directorio actual uno a la vez. Estoy buscando una manera de tomar la salida de ls o find y almacenar el valor resultante como elementos de una matriz. De esta manera puedo manipular los elementos de la matriz según sea necesario.

Author: eebbesen, 2011-01-13

4 answers

Para responder a su pregunta exacta, use lo siguiente:

arr=( $(find /path/to/toplevel/dir -type f) )

Ejemplo

$ find . -type f
./test1.txt
./test2.txt
./test3.txt
$ arr=( $(find . -type f) )
$ echo ${#arr[@]}
3
$ echo ${arr[@]}
./test1.txt ./test2.txt ./test3.txt
$ echo ${arr[0]}
./test1.txt

Sin embargo, si solo desea procesar archivos uno a la vez, puede usar la opción find's -exec si el script es algo simple, o puede hacer un bucle sobre lo que find devuelve así:

while IFS= read -r -d $'\0' file; do
  # stuff with "$file" here
done < <(find /path/to/toplevel/dir -type f -print0)
 47
Author: SiegeX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-13 09:33:55
for i in `ls`; do echo $i; done;

No puede ser más simple que eso!

Editar: hmm-según el comentario de Dennis Williamson, ¡parece que puedes!

Edición 2: aunque el OP pregunta específicamente cómo analizar la salida de ls, solo quería señalar que, como los comentaristas a continuación han dicho, la respuesta correcta es "no lo haces". Use for i in * o similar en su lugar.

 9
Author: simon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-28 21:08:30

En realidad no necesita usar ls/find para los archivos en el directorio actual.

Simplemente use un bucle for:

for files in *; do 
    if [ -f "$files" ]; then
        # do something
    fi
done

Y si también desea procesar archivos ocultos, puede establecer la opción relativa:

shopt -s dotglob

Este último comando solo funciona en bash.

 4
Author: marco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-13 17:27:37

Dependiendo de lo que quieras hacer, puedes usar xargs:

ls directory | xargs cp -v dir2

Por ejemplo. xargs actuará sobre cada artículo devuelto.

 -1
Author: TyrantWave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-13 09:21:07