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 d'un fichier, mais je dois lire une variable contenant du texte.
while read -d $'\0' line ; do
# Code here
done < /path/to/inputfile
En bash, vous pouvez utiliser une chaîne ici
while IFS= read -r -d '' line ; do
# Code here
done <<<"$var"
Notez que vous devez insérer le IFS=
et simplement utiliser -d ''
tout en vous assurant qu'il y a un espace entre le 'd' et le premier guillemet simple. Ajoutez également l'indicateur -r
pour ignorer les échappements.
En outre, cela ne fait pas partie de votre question, mais pourrais-je suggérer une meilleure façon de faire votre script en utilisant find
; il utilise la substitution de processus.
while IFS= read -r -d '' file; do
# Arbitrary operations on "$file" here
done < <(find /some/path -type f -print0)
J'ai essayé de travailler avec les exemples bash ci-dessus, puis j'ai abandonné et utilisé Python, qui a fonctionné la première fois. Pour moi, le problème était plus simple en dehors de Shell. Je sais que c'est peut-être hors de propos d'une solution bash, mais je l'affiche ici quand même 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(),))