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.


Ä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'

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 *)


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"


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.