2016-10-19 3 views
0

Je souhaite renommer un fichier nommé d'une manière énumérée. Mon approche précédente était d'utiliser cette ligne de commande:Comportement différent lors de l'exécution de ls à partir d'un script

FILES=`ls "someDir/"`; for f in $FILES; do echo "Processing file: $f"; done; 

Echoing le nom du fichier est uniquement à des fins de démonstration. Le produit ci-dessus la sortie attendue:

Processing file: File1 
Processing file: File2 
Processing file: File3 
... 

Cependant quand je lance (ce que je pensais est la même chose) le script ci-dessous, il traite toute sortie ls comme un seul fichier et produit cette sortie:

SCRIPT: 
#!/bin/bash 
FILES=`ls "someDir/"` 

for f in $FILES 
do 
    echo "Processing file: $f" 
done 

OUTPUT: 
Processing file: File1 
File2 
File3 
... 

Je n'arrive pas à comprendre. Aussi, je ne suis même pas sûr que ce soit ls qui produit ce comportement. Quel est l'origine de ce comportement? Et pourquoi?

Répondre

2

Voir Why you shouldn't parse the output of ls(1), et d'utiliser plutôt process-substitution pour traiter la sortie de commande.

#!/bin/bash 

while IFS= read -r -d '' file; do 
    echo "$file" 
    # Do whatever you want to do with your file here 
done < <(find someDir/ -maxdepth 1 -mindepth 1 -type f -print0 | sort -z) 

Les simples ci-dessus find répertorie tous les fichiers du répertoire requis (y compris ceux ayant des espaces /-caractères spéciaux). Ici, la sortie de la commande find est envoyée à stdin qui est analysée par while-loop.

Pour ordonner le tri des fichiers, ajoutez un sort -z à la sortie de la commande find.

+0

Existe-t-il un moyen de dire 'find' pour garder l'ordre réel des fichiers? Puisque j'ai besoin qu'ils soient traités dans l'ordre dans lequel ils sont nommés. Donc 'File1' d'abord, puis' File2' et ainsi de suite. Mais 'find' produit une sortie ordonnée manquante comme' File325', 'File3',' File20', .... – muXXmit2X