2009-07-06 11 views
7

Commencé à apprendre des scripts shell. J'ai un script Perl qui s'exécute sur un fichier. Comment est-ce que j'écrirais un script de coquille pour exécuter le manuscrit de perl un certain nombre de fois sur tous les dossiers avec le mot-clé "filename" dedans?Exécution d'un script sur plusieurs fichiers sous Unix

Donc en anglais,

for /filename/ in filenames 
    perl myscript.pl completefilename 

Merci.

Répondre

10
find . -name "filename*" -exec perl myscript.pl '{}' \; 
1

En bash:

files=`ls -1 *` 
for $file in $files; 
do 
    perl myscript.pl $file; 
done 
+0

Cela ne fonctionne que tant qu'il n'y a pas de noms de fichiers contenant des espaces. – hillu

4
find . -path "\*filename\*" -exec perl myscript.pl {} \; 

modifier: étoiles échappé, ne voulait pas le balisage ici

4
for i in $(\ls -d filenames) 
do 
    perl myscript.pl $i 
done 

La barre oblique inverse devant la commande 'ls est de désactiver temporairement les alias.

HTH

1

Une doublure:

$ for file in filename1 filename2 filename3; do perl myscript $file; done

Au lieu de la liste séparée de l'espace de noms de fichiers, vous pouvez également utiliser des caractères génériques, par exemple:

$ for file in *.txt *.csv; do perl myscript $file; done

2

Et si vous avoir des espaces dans vos noms de fichiers, utilisez l'ancienne veille

find . -maxdepth 1 -print0 | xargs -0 perl myscript.pl 
0

j'utilise le shell zsh, qui vous donne une très belle façon de lancer une commande récursive sur un ensemble de sous-répertoires. Il vous permet également de changer le suffixe du fichier, ce qui est pratique lorsque vous utilisez lame pour créer des fichiers MP3 de fichiers .wav:

pour i dans **/*. Wav; lame $ i $ i: r.mp3

Vous pouvez également diriger la sortie d'une commande vers une autre, ce que j'utilise souvent quand je télécharge un certain nombre de fichiers bittorrent et que je veux voir le pourcentage que chaque téléchargement a terminé:

pour i dans **/*. txt; grep -H pour cent $ i | tail -1

Questions connexes