63 votes

Lecture de chaînes délimitées nulles via une boucle Bash

Je veux parcourir une liste de fichiers sans me soucier des caractères que les noms de fichiers peuvent contenir, j'utilise donc une liste délimitée par des caractères nuls. Le code expliquera mieux les choses.

 # Set IFS to the null character to hopefully change the for..in
# delimiter from the space character (sadly does not appear to work).
IFS=$'\0'

# Get null delimited list of files
filelist="`find /some/path -type f -print0`"

# Iterate through list of files
for file in $filelist ; do
    # Arbitrary operations on $file here
done

Le code suivant fonctionne lors de la lecture à partir d'un fichier, mais j'ai besoin de lire à partir d'une variable contenant du texte.

 while read -d $'\0' line ; do
    # Code here
done < /path/to/inputfile

108voto

SiegeX Points 32614

La meilleure façon de le faire est d'utiliser la substitution de processus

 while IFS= read -r -d $'\0' file; do
    # Arbitrary operations on "$file" here
done < <(find /some/path -type f -print0)

Si vous étiez déterminé à analyser une variable bash de la même manière, vous pouvez le faire tant que la liste ne se termine pas par NUL .

Voici un exemple de bash var contenant une chaîne délimitée par des tabulations

 $ var=$(echo -ne "foo\tbar\tbaz\t"); 
$ while IFS= read -r -d $'\t' line ; do \
    echo "#$line#"; \
  done <<<"$var"
#foo#
#bar#
#baz#

-5voto

Henry Crutcher Points 1278

J'ai essayé de travailler avec les exemples bash ci-dessus, et j'ai finalement abandonné et j'ai utilisé Python, qui a fonctionné la première fois. Pour moi, il s'est avéré que le problème était plus simple en dehors du shell. Je sais que c'est peut-être hors sujet d'une solution bash, mais je le poste quand même ici au cas où d'autres voudraient une alternative.

 import sh
import path
files = path.Path(".").files()
for x in files:
    sh.cp("--reflink=always", x, "UUU00::%s"%(x.basename(),))
    sh.cp("--reflink=always", x, "UUU01::%s"%(x.basename(),))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X