Wie kopiere ich mehrere Dateien, ohne dass ihre Erweiterungen verloren gehen?

Wie kopiere ich mehrere Dateien, ohne dass ihre Erweiterungen verloren gehen?

Ich durchlaufe eine Reihe von Dateien und $filestelle 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 $filemit 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 _origin 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:substringstring

$ 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 -pweist darauf hin zcp, dass die Option -pan den cpBefehl übergeben werden soll, um die Dateimetadaten (insbesondere die Änderungszeiten) beizubehalten.

verwandte Informationen