4 votes

Espace dans le nom du dossier à l'intérieur d'une boucle FIND

Je travaille sur un script qui doit lire des fichiers dans une boucle FIND. Quelque chose comme ceci :

DIRINI=/Volumes/dados/App\ Data/DATABASE.noindex/30000
for FILE  in `find "$DIRINI"  -type f ` ; do
stat $FILE
stat "$FILE"
stat '$FILE'
done

Le problème est le suivant : lorsque le nom du dossier contient un espace, je dois mettre la variable $DIRINI à l'intérieur d'un "" et cela fait fonctionner FIND, mais les autres commandes à l'intérieur de la boucle qui utilisent $DIRINI ne fonctionnent pas, elles divisent le nom du dossier en deux et utilisent une moitié dans chaque cycle.

Quelqu'un a-t-il une idée de ce que je peux faire ? Merci d'avance

5voto

nohillside Points 82672

Ne passez pas en boucle les résultats de la recherche, il y a trop de choses qui peuvent et vont mal se passer. Utilisez

find "$DIRINI" -type f -exec stat {} \;

ou

find "$DIRINI" -type f -print0 | xargs -0 stat

à la place.

1voto

Michael Zhou Points 167

Il s'agit d'un exemple classique où le shell effectue le découpage des mots. Lorsque vous assignez une variable avec des espaces, la valeur doit être citée, par exemple, var="foo bar" . Lorsque la variable var est développée sur le côté droit d'une commande, la variable doit être citée ou l'interpréteur de commandes divise la variable en deux arguments ou plus.

Lorsque vous utilisez la substitution de commande dans un for la substitution de la commande est développée sous forme de résultats délimités par des espaces. Ainsi,

for line in `find dir -type f`

s'étend à

for line in filename with spaces filename file name with spaces

chaque mot devient un argument au lieu des noms de fichiers réels.

La solution 1 : est d'acheminer les résultats de find dans une boucle while read :

find "$DIRINI"  -type f | while IFS= read -r line; do
    command "$line"
    command "$line"
done

Solution 2 : utiliser la substitution de processus avec une boucle de lecture while :

while IFS= read -r line; do
    command "$line"
    command "$line"
done < <(find "$DIRINI"  -type f)

Solution 3 : utilisez simplement find :

find "$DIRINI"  -type f -exec command {} \; -exec command {} \;

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X