Estoy tratando de buscar archivos usando find
y poner esos archivos en una matriz Bash para poder hacer otras operaciones en ellos (por ejemplo, ls
o grep
ellos). Pero no puedo entender por qué readarray
no está leyendo el find
resultado, ya que está conectado a él.
Digamos que tengo dos archivos en el directorio actual file1.txt
y file2.txt
. Entonces la find
salida es la siguiente:
$ find . -name "file*"
./file1.txt
./file2.txt
Así que quiero canalizar eso en una matriz cuyos dos elementos son las cadenas "./file1.txt"
y "./file2.txt"
(sin comillas, obviamente).
He intentado esto, entre algunas otras cosas:
$ declare -a FILES
$ find . -name "file*" | readarray FILES
$ echo "${FILES[@]}"; echo "${#FILES[@]}"
0
Como puede ver en la echo
salida, mi matriz está vacía.
Entonces, ¿qué estoy haciendo mal aquí exactamente? ¿Por qué readarray
no está leyendo find
la salida como entrada estándar y colocando esas cadenas en la matriz?
readarray -d '' < <(find your_args -print0)
La solución correcta es:
Eso es similar a lo que Greg's BashFAQ 020 explica en detalle y esta respuesta cubre .
No tiene ningún problema con archivos con nombres impares (que no contienen NUL en el nombre), con espacios o líneas nuevas. Y el resultado se establece en una matriz, lo que lo hace útil para su posterior procesamiento.
fuente
readarray
también puede leer de stdinfuente
find -print0
para proteger contra nombres de archivo "inesperados".