2013-09-16 11 views
0

j'ai besoin de boucle à travers différents répertoires et de fichiers ayant le même nom, mais incrémente de 1, 001, 002, 003 à 100.Bash Looping dans les répertoires et les noms de fichiers

/Very/long/path/to/folder001/very_long_filename001.foobar 
/Very/long/path/to/folder002/very_long_filename002.foobar 
/Very/long/path/to/folder003/very_long_filename003.foobar 


$FILES=/Very/long/path/to/folder*/very_long_filename*.foobar 
for f in $FILES 
do 
    echo "$f" 
done 

La boucle for j'ai écrit ci-dessus ça ne marche pas, et je ne comprends vraiment pas pourquoi! Un indice? Merci.

Répondre

5

Utilisez un tableau à la place:

FILES=(/Very/long/path/to/folder*/very_long_filename*.foobar) 
for f in "${FILES[@]}" 
do 
    echo "$f" 
done 

Une autre façon de le faire tourner dans l'ordre:

for i in $(seq -w 001 100); do 
    f="/Very/long/path/to/folder${i}/very_long_filename${i}.foobar" 
    [[ -e $f ]] || continue ## optional test. 
    echo "$f" 
done 

Par la façon dont votre boucle for ne fonctionne pas depuis que vous avez commencé votre mission avec $:

`$FILES=...` 

Il aurait simplement dû êtreL'utilisation d'un tableau est plus sûre car il préserve les espaces dans les noms de fichiers pendant l'expansion pour for.

+1

Merci pour la réponse. Je viens de Perl, d'où les $ FILES :-) –

2

Tout d'abord, ne pas utiliser un signe de dollar pour assigner à une variable:

FILES=/Very/long/path/to/folder*/very_long_filename*.foobar 

Vous n'avez pas besoin d'une variable à tous; vous pouvez itérer directement sur un modèle glob:

for f in /Very/long/path/to/folder*/very_long_filename*.foobar; do 
Questions connexes