Ich durchlaufe eine Reihe von Dateien und $file
stelle die aktuelle Datei dar.
Wie kann ich Kopien erstellen oder umbenennen und die Erweiterung für die aktuelle Datei beibehalten?
zB wenn $file
=x.jpg
So erstellen Sie eine Kopie von $file
mit dem Dateinamenx_orig.jpg
Bisher habe ich:
for file in /tmp/p/DSC*.JPG; do
cp $file $file+'_orig'.JPG
done
aber das kopiert die Datei
DSCF1748.JPG
Zu
DSCF1748.JPG+_orig.JPG
während ich eine Kopie mit dem Namen möchte
DSCF1748_orig.JPG
Ebensocp $file "$file"_orig.JPG
Ergebnisse in Dateien wieDSCF1748.JPG_orig.JPG
Ich möchte das _orig
in der Mitte des Dateinamens bekommen...
Antwort1
Sie können bash's verwendenFunktionen zur Zeichenfolgensubstitutiondafür:
for file in /tmp/p/DSC*.JPG; do
cp "$file" "${file%.JPG}"_orig.JPG
done
Das allgemeine Format ist , das vom Ende von ${string%substring}
entfernt wird . Beispiel:substring
string
$ f=foobar.JPG; echo "${f%.JPG}"
foobar
Antwort2
zcp -o -p '/tmp/p/DSC*.JPG' '$f:r_orig.JPG'
oder gleichwertig
zcp -o -p '/tmp/p/(DSC*).JPG' '/tmp/p/${1}_orig.JPG'
Dies erfordert, dass Sie zsh ausführen (andere Shells haben nichts dergleichen) und Folgendes in Ihr einfügen ~/.zshrc
:
autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'
-o -p
weist darauf hin zcp
, dass die Option -p
an den cp
Befehl übergeben werden soll, um die Dateimetadaten (insbesondere die Änderungszeiten) beizubehalten.