Frage

Angenommen, ich habe drei Dateien (template_*.txt):

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

Ich möchte sie in drei neue Dateien kopieren (foo_*.txt).

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

Gibt es eine einfache Möglichkeit, dies mit einem Befehl zu tun, z.

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

War es hilfreich?

Lösung

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

Andere Tipps

[01:22 PM] matt@Lunchbox:~/tmp/ba$
ls
template_x.txt  template_y.txt  template_z.txt

[01:22 PM] matt@Lunchbox:~/tmp/ba$
for i in template_*.txt ; do mv $i foo${i:8}; done

[01:22 PM] matt@Lunchbox:~/tmp/ba$
ls
foo_x.txt  foo_y.txt  foo_z.txt

Mein bevorzugter Weg:

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

Der Weg „Ich erinnere mich nicht an die Substitutionssyntax“:

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

Das sollte funktionieren:

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

Funktioniert wahrscheinlich nicht, wenn Ihre Dateinamen ungewöhnliche Zeichen enthalten.Entfernen Sie das „-v“, wenn Sie sicher sind, dass es zuverlässig funktioniert.

Der Befehl mmv (verfügbar in Debian oder Fink oder einfach selbst zu kompilieren) wurde genau für diese Aufgabe erstellt.Bei der einfachen Bash-Lösung muss ich immer die Dokumentation zur Variablenerweiterung nachschlagen.Aber mmv ist viel einfacher zu bedienen, fast schon „großartig“!;-)

Ihr Beispiel wäre:

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

mmv kann auch komplexere Muster verarbeiten und verfügt über einige Plausibilitätsprüfungen. So stellt es beispielsweise sicher, dass keine der Dateien im Zielsatz im Quellsatz erscheint (damit Sie Dateien nicht versehentlich überschreiben können).

Ich weiß nichts über Bash oder CP, aber es gibt einfache Möglichkeiten, so etwas zu tun, indem man (zum Beispiel) ein Perl-Skript verwendet:

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

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

Dann:

rename s/template/foo/ *.txt

Noch eine andere Möglichkeit:

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

Ich war schon immer von ImageMagick beeindruckt Konvertieren Programm, das mit Bildformaten das tut, was Sie erwarten:

$ convert rose.jpg rose.png

Es gibt ein Schwesterprogramm, das Stapelkonvertierungen ermöglicht:

$ mogrify -format png *.jpg

Offensichtlich beschränken sich diese auf Bildkonvertierungen, verfügen aber über interessante Befehlszeilenschnittstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top