web-dev-qa-db-fra.com

Lecture de chaînes délimitées par le biais d'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 d'un fichier, mais je dois lire une variable contenant du texte.

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

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)
63
SiegeX

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(),))
0
Henry Crutcher