Bash One Liner:template_*.txt nach foo_*.txt kopieren?
-
09-06-2019 - |
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
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.