Boucle par trouver la sortie dans Bash où le nom de fichier contient des espaces blancs
J'essaie de recherche pour les fichiers qui peuvent contenir des espaces blancs, j'essaye d'utiliser -print0
et définir IFS
voici mon script
IFS=$'IFS=$'\0';find people -name '*.svg' -print0 | while read file; do
grep '<image' $file > /dev/null && echo $file | tee -a embeded_images.txt;
done
';find people -name '*.svg' -print0 | while read file; do
grep '<image' $file > /dev/null && echo $file | tee -a embeded_images.txt;
done
J'essaie de bien, d'un fichier svg contenant embeded d'images, de travailler sans -print0 mais échoue à un un fichier, j'ai donc arrêter le script. Ici est plus simple exemple qui ne fonctionne pas trop,
IFS=$'IFS=$'\0';find . -print0 | while read file; do echo $file; done
';find . -print0 | while read file; do echo $file; done
il n'affiche rien.
OriginalL'auteur jcubic | 2012-07-06
Vous devez vous connecter pour publier un commentaire.
Utilisation
read -d '' -r file
et définirIFS
que dans le contexte deread
:Et devis de vos variables.
Étrange
read -d'' -r file; do
ne fonctionnent pas, mais avec un espace-d ''
.Le contenu des guillemets simples est null. Bash voit
-d''
comme un argument. Quand il ne les devis de suppression il n'y a rien à gauche, mais-d
. Il voit-d ''
que deux arguments, dont l'un est null.OriginalL'auteur Dennis Williamson
Si Dennis Williamson réponse est absolument correct, il crée un shell interne est exécuté, ce qui vous évitera de définir toutes les variables à l'intérieur de la boucle. Vous pouvez envisager d'utiliser des processus de substitution, de la manière suivante:
La première
<
indique que vous êtes en train de lire à partir d'un fichier, et le<(find...)
est remplacé par un nom de fichier (généralement une poignée pour un tuyau) qui retourne la sortie defind
directement. Parce quewhile
lit à partir d'un fichier au lieu d'un tuyau, la boucle peut définir des variables qui sont accessibles de l'extérieur de la portée.OriginalL'auteur Jeff Bowman