2009-07-06 12 views
7

Comenzó a aprender algunos scripts de shell. Tengo un script de Perl que se ejecuta en un archivo. ¿Cómo escribiría un script de shell para ejecutar el script de Perl un montón de veces en todos los archivos con la palabra clave "nombre de archivo" en él?Ejecute una secuencia de comandos sobre varios archivos en Unix

Así que en Inglés,

for /filename/ in filenames 
    perl myscript.pl completefilename 

Gracias.

Respuesta

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

Esto solo funciona mientras no haya nombres de archivo con espacios en ellos. – hillu

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

de edición: escapado estrellas, no querían que el margen de beneficio aquí

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

La barra invertida delante del comando 'ls' es deshabilitar temporalmente cualquier alias.

HTH

1

Un forro:

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

En lugar de la lista separada por espacios de nombres de archivos también se puede utilizar comodines, por ejemplo:

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

2

Y si tener espacios en sus nombres de archivo, use el antiguo modo de espera

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

Yo personalmente uso el shell zsh, que le da una muy buena manera de ejecutar un comando de forma recursiva en un conjunto de subdirectorios. También le permite cambiar el sufijo del archivo, que es a mano cuando usa lame para crear archivos MP3 de archivos .wav:

para i en **/*. Wav; lame $ i $ i: r.mp3

También puede conectar la salida de un comando a otro, algo que uso frecuentemente cuando descargo una cantidad de archivos bittorrent y quiero ver el porcentaje que cada descarga ha completado:

para i en **/*. txt; grep -H por ciento $ i | tail -1

Cuestiones relacionadas