2008-08-25 16 views

Répondre

11
 
for f in template_*.txt; do cp $f foo_${f#template_}; done 
1

Je ne sais pas de quoi que ce soit en bash ou cp, mais il existe des moyens simples pour faire ce genre de chose en utilisant (par exemple) un script perl:

($op = shift) || die "Usage: rename perlexpr [filenames]\n"; 

for (@ARGV) { 
    $was = $_; 
    eval $op; 
    die [email protected] if [email protected]; 
    rename($was,$_) unless $was eq $_; 
} 

Ensuite, :

rename s/template/foo/ *.txt 
+0

Sur mon système debian, il y a un script Perl installé à '/ usr/bin/rename' (partie du paquet' perl') qui fait exactement cela. –

1
for i in template_*.txt; do cp -v "$i" "`echo $i | sed 's%^template_%foo_%'`"; done 

va probablement casser si vos noms ont des caractères funky en eux. Supprimez le '-v' quand (si) vous avez confiance que cela fonctionne de manière fiable.

2

Cela devrait fonctionner:

for file in template_*.txt ; do cp $file `echo $file | sed 's/template_\(.*\)/foo_\1/'` ; done 
0

Encore une autre façon de le faire:

$ ls template_*.txt | sed -e 's/^template\(.*\)$/cp template\1 foo\1/' | ksh -sx 

J'ai toujours été impressionné par le programme ImageMagick convert qui fait ce que vous attendre avec des formats d'image:

$ convert rose.jpg rose.png 

Il a un programme soeur qui permet des conversions par lots:

$ mogrify -format png *.jpg 

Il est évident que ceux-ci sont limitées à des conversions d'images, mais ils ont des interfaces de ligne de commande intéressantes.

1

La commande mmv (disponible en Debian ou Fink ou facile à compiler vous-même) a été créée précisément pour cette tâche. Avec la solution Bash, je dois toujours consulter la documentation sur l'expansion des variables. Mais mmv est beaucoup plus simple à utiliser, assez proche de "awesomeness"!;-)

Votre exemple serait:

mcp "template_*.txt" "foo_#1.txt" 

mmv peut gérer des modèles plus complexes aussi bien et il a quelques contrôles de santé mentale, par exemple, il fera en sorte qu'aucun des fichiers dans le jeu de destination seront dans le jeu source (donc vous ne pouvez pas écraser accidentellement des fichiers).

3

Ma façon préférée:

for f in template_*.txt 
do 
    cp $f ${f/template/foo} 
done 

La façon "je-ne-souvenir-la-substitution-syntaxe":

for i in x y z 
do 
    cp template_$i foo_$ 
done