2008-08-25 3 views
8

sagen, dass ich drei Dateien (. Template _ * .txt):Bash One Liner: Kopiervorlage _ *. Txt to foo _ *. Txt?

  • template_x.txt
  • template_y.txt
  • template_z.txt

Ich möchte, dass sie drei neue Dateien kopieren (foo _ *. txt).

  • foo_x.txt
  • foo_y.txt
  • foo_z.txt

Gibt es eine einfache Möglichkeit, dass mit einem Befehl zu tun, zum Beispiel

cp --enableAwesomeness template_*.txt foo_*.txt

Antwort

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

Ich weiß nicht von irgendetwas in bash oder auf cp, aber es gibt einfache Möglichkeiten, diese Art der Sache zu tun (zum Beispiel) einen Perl-Skript:

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

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

Dann :

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

auf meinem Debian-System gibt es einen Perl-Skript installiert an '/ usr/bin/rename' (Teil des Pakets' perl'), was ziemlich genau das tut. –

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

Wahrscheinlich bricht, wenn Ihre Dateinamen in ihnen flippige Zeichen lang sein. Entfernen Sie das '-v', wenn (wenn) Sie das Vertrauen haben, dass es zuverlässig funktioniert.

2

Dies sollte funktionieren:

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

Noch ein anderer Weg, es zu tun:

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

Ich habe immer mit dem ImageMagick convert Programm beeindruckt das, was Sie tut erwarten Sie mit Bildformaten:

$ convert rose.jpg rose.png 

Es hat eine Schwester-Programm, das Batch-Konvertierungen erlaubt:

$ mogrify -format png *.jpg 

Offensichtlich sind diese beschränkt auf Bildkonvertierungen, aber sie haben interessante Kommandozeilen-Schnittstellen.

1

Der Befehl mmv (verfügbar in Debian oder Fink oder leicht zu kompilieren) wurde genau für diese Aufgabe erstellt. Mit der einfachen Bash-Lösung muss ich immer die Dokumentation über die variable Erweiterung nachschlagen. Aber mmv ist viel einfacher zu bedienen, ganz in der Nähe von "awesomeness"!;-)

Ihr Beispiel wäre:

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

mmv auch komplexere Muster verarbeiten kann und es hat einige Plausibilitätsprüfungen, zum Beispiel, wird es sicher keine der Dateien im Zielsatz erscheinen in der Quellengruppe (damit Sie nicht versehentlich Dateien überschreiben können).

3

Meine bevorzugte Art und Weise:

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

Die "Ich-nicht-erinnern-the-Substitution-Syntax" Art und Weise:

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