J'essaie de rechercher des fichiers en utilisant find
et de placer ces fichiers dans un tableau Bash afin de pouvoir effectuer d'autres opérations sur eux (par exemple, ls
ou sur grep
eux). Mais je ne peux pas comprendre pourquoi readarray
ne lit pas la find
sortie car elle y est canalisée.
Supposons que j'ai deux fichiers dans le répertoire en cours, file1.txt
et file2.txt
. La find
sortie est donc la suivante:
$ find . -name "file*"
./file1.txt
./file2.txt
Je veux donc canaliser cela dans un tableau dont les deux éléments sont les chaînes "./file1.txt"
et "./file2.txt"
(sans guillemets, évidemment).
J'ai essayé cela, entre autres:
$ declare -a FILES
$ find . -name "file*" | readarray FILES
$ echo "${FILES[@]}"; echo "${#FILES[@]}"
0
Comme vous pouvez le voir sur la echo
sortie, mon tableau est vide.
Alors qu'est-ce que je fais mal ici? Pourquoi readarray
ne pas lire find
la sortie de son entrée standard et mettre ces chaînes dans le tableau?
readarray -d '' < <(find your_args -print0)
La bonne solution est:
C'est similaire à ce que Greg's BashFAQ 020 explique en détail et cette réponse couvre .
N'a aucun problème avec les fichiers nommés impairs (qui ne contiennent aucun NUL dans le nom), avec des espaces ou de nouvelles lignes. Et le résultat est défini dans un tableau, ce qui le rend utile pour un traitement ultérieur.
la source
readarray
peut également lire depuis stdinla source
find -print0
pour la protection contre les noms de fichiers "inattendus".