Kopieren / Umbenennen mehrerer Dateien mit regulären Ausdrücken (Shell-Skript)

8

Ich habe eine Sammlung von Dateien, die einem Muster entsprechen, wie z. B. 'Zuordnung02.cc', 'Zuordnung02.h', 'Zuweisung02.txt' usw. Ich möchte diese Dateien in 'Zuordnung03.cc', 'Zuweisung03 "kopieren / umbenennen. h ',' assign03.txt 'und so weiter.

Ich vermute, dass dies mit einem Shell-Skript und sed einfach sein sollte. Bisher habe ich:

OLD_NO=$1
NEW_NO=$2

echo "Moving from $OLD_NO to $NEW_NO"

for name in assignment$OLD_NO.* ; do
  newname=$(echo $name | sed 's/\(.*\)$OLD_NO\(.*\)/\1xx$NEW_NO\2/')
  echo "$name -> $newname"
  # mv -v $name $newname
done

Leider gibt die Art und Weise, wie ich sed aufrufe, immer die Eingabezeichenfolge zurück $nameund führt das Regex-Suchen / Ersetzen nicht durch.

Hinweis: Im Internet gibt es einen renameBefehl mit dieser Funktionalität, der jedoch auf meinem MacBook nicht verfügbar ist.

Gilles 'SO - hör auf böse zu sein'
quelle
Ändern Sie die einfachen Anführungszeichen in doppelte Anführungszeichen. Wenn Sie einfache Anführungszeichen um den sed Befehl haben, dann $OLD_NOund $NEW_NOwird nicht erweitert erhalten.
Mikel
newname=$(echo $name | tr $OLD_NO $NEW_NO)
Nizam Mohamed

Antworten:

5

Die Verwendung von sed führt zu mehr Komplexität als es wert ist. Verwenden Sie die integrierten Textbearbeitungsfunktionen der Shell. Entfernt beispielsweise ${name#assignment02}das Präfix assignment02von $name.

for name in assignment02.*; do
  mv "$name" "assignment03${name#assignment02}"
done

Die doppelten Anführungszeichen sind nicht erforderlich, wenn Sie sicher sind, dass die Dateinamen keine Shell-Sonderzeichen enthalten.

Wenn Sie zsh zur Verfügung haben, ist seine zmvFunktion für diese Art von Umbenennungen hilfreich.

autoload zmv
zmv '(assignment)02.(*)' '${1}03.$2'
Gilles 'SO - hör auf böse zu sein'
quelle
3

Du denkst schon zu komplex

rename 02 03 *02*

'umbenennen' ersetzt das erste Argument ('02') durch das zweite Argument ('03') im Namen aller Dateien, die auf arg3 oder danach angegeben sind (* 02 *)

Patrick
quelle
Der renameBefehl mit dieser Syntax ist ein Linux-Dienstprogramm, das unter OSX nicht verfügbar ist (und in den meisten Debian- und Ubuntu-Installationen nicht einmal unter diesem Namen verfügbar ist).
Gilles 'SO - hör auf böse zu sein'
Ah, wusste nicht, dass Sie auf Osx waren, Mist
Patrick
Rename ist ein Perl-Skript, daher wird es wahrscheinlich unter OS X ausgeführt. Es wurde hier mit Google gefunden: tips.webdesign10.com/files/rename.pl.txt
azzid
0

Ein anderer Versuch:

for ext in {cc,h,txt}
do 
  echo mv assignment02.$ext assignment03.$ext
done

Auf lange Sicht: Versuchen Sie, "umzubenennen"

Benutzer unbekannt
quelle
-1

Eine Möglichkeit, dies zu tun, ist:

ls -1  | sed "s/\(.*\)\..*$/mv '&' '\1.txt'/" | sh
Mazianni
quelle
2
Analysieren Sie nicht die Ausgabe vonls . Das Generieren eines Shell-Skripts ist ein sicherer Weg, sich in den Kopf zu schießen. Die Frage von Vault Boy enthält einen vernünftigen Ansatz auf der Muschelseite, bei dem nur die richtige Beschwörung und einige Zitate fehlen.
Gilles 'SO - hör auf böse zu sein'