¿Cómo capturo la salida de los comandos ls o encuentro para almacenar todos los nombres de archivo en una matriz?
Pregunta
La necesidad de procesar archivos en un solo directorio actual a la vez. Busco 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.
Solución
Para responder a su pregunta exacta, utilice la 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 lo que desea es procesar archivos de uno en uno, puede find
opción ya sea para uso de -exec
si el guión es algo simple, o se puede hacer un bucle sobre lo que encontrar vuelve de esta manera:
while IFS= read -r -d $'\0' file; do
# stuff with "$file" here
done < <(find /path/to/toplevel/dir -type f -print0)
Otros consejos
for i in `ls`; do echo $i; done;
No se puede conseguir más simple que eso!
editar: hmm - de acuerdo con el comentario de Dennis Williamson, parece que se puede
editar 2: aunque la OP pide específicamente la forma de analizar la salida de ls
, sólo quería señalar que, como los comentaristas de abajo se han dicho, la respuesta correcta es "no". Uso for i in *
o similar en lugar.
En realidad no es necesario el uso de ls / encontrar los archivos en el directorio actual.
Sólo tiene que utilizar un bucle for:
for files in *; do
if [ -f "$files" ]; then
# do something
fi
done
Y si quieres archivos ocultos del proceso también se puede establecer la opción relativa:
shopt -s dotglob
Este último comando funciona sólo en bash.
En función de lo que quiere hacer, podría utilizar xargs:
ls directory | xargs cp -v dir2
Por ejemplo. xargs actuarán en cada artículo devuelto.