¿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.
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)
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.
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.
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.
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