Massenumbenennung, Präfix ändern

53

Wie kann ich das Präfix für viele Dateien als Bulk ersetzen?

Ich habe viele Dateien wie

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

Ich möchte alle in ändern

  • CLConnectionContext.h
  • CLConnectionContext.m

Wie würde ich das machen?

ErikTJ
quelle

Antworten:

38
for name in TestSR*
do
    newname=CL"$(echo "$name" | cut -c7-)"
    mv "$name" "$newname"
done

Hierbei werden die ersten 6 Zeichen des Eingabedateinamens durch den Bash-Befehl ersetzt, dem Ergebnis cutvorangestellt und CLin gespeichert $newname. Dann wird der alte Name in den neuen Namen umbenannt. Dies wird für jede Datei durchgeführt.

cut -c7-Gibt an, dass nur Zeichen nach Index 7 von der Eingabe zurückgegeben werden sollen. 7-ist ein Bereich, der bei Index 7 ohne Ende beginnt; das heißt, bis zum Ende der Zeile.

Zuvor hatte ich verwendet cut -b7-, -csollte aber stattdessen verwendet werden, um Zeichencodierungen zu verarbeiten, die mehrere Bytes pro Zeichen enthalten können, wie z. B. UTF-8.

mrb
quelle
Thx, ich habe das jetzt auch von mir. Als Antwort markieren. Thx
ErikTJ
Das funktioniert gut, danke. Können Sie erklären, was der -b7- tut? Handelt es sich um einen Verweis auf die Byteliste? ss64.com/bash/cut.html
26.
@imjared Die Antwort wurde mit weiteren Details aktualisiert.
Mrb
56

Ich würde sagen, am einfachsten ist es, einfach den renameBefehl zu verwenden, der auf vielen Linux-Distributionen üblich ist. Es gibt zwei gängige Versionen dieses Befehls. Überprüfen Sie die Manpage, um herauszufinden, welche Sie haben:

## rename from Perl (common in Debian systems -- Ubuntu, Mint, ...)
rename 's/^TestSR/CL/' *

## rename from util-linux-ng (common in Fedora systems, Red Hat, CentOS, ...)
rename TestSR CL *

Wenn Sie die Version von util-linux-ng in einem Debian-System verwenden möchten, ist sie unter dem Namen verfügbar rename.ul

carandraug
quelle
7
Eine Einschränkung: Es gibt mehrere Versionen von renamein freier Wildbahn. Lesen Sie in Ihrer lokalen renameDokumentation nach, wie Sie mit Ihrer umgehen.
jw013
So entfernen Sie den Alias ​​dorename TestSR '' *
Bsienn
hmm ... rename "\<pre\>" "" *->Unterminated <> operator at (user-supplied code).
Flash Thunder
32

Die Erweiterung der Shell-Parameter reicht für einfache Transformationen wie diese aus. Die Befehlssubstitution ist weniger effizient, da zusätzliche Prozesse erzeugt werden müssen (für die Befehlssubstitution selbst und das cut/ sed).

for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done
jw013
quelle
Erläuterung: TestSR*Findet die Dateien, CL${f#TestSR}wird der neue Name sein. Das Zeug nach dem #wird durch den Dateinamen ( f) ersetzt.
Joe Eifert
4

Hier ist eine Möglichkeit:

ls *.{h,m} | while read a; do n=CL$(echo $a | sed -e 's/^Test//'); mv $a $n; done
  • ls *.{h,m} -> Finden Sie alle Dateien mit der Erweiterung .h oder .m
  • n=CL -> Fügen Sie dem Dateinamen ein CL-Präfix hinzu
  • sed -e 's/^Test//' -> Entfernt das Test-Präfix aus dem Dateinamen
  • mv $a $n -> Führt die Umbenennung durch
Eric
quelle
3

Sie können versuchen mit:

for i in TestSR*; do mv ${i} ${i/#TestSR/CL}; done

Siehe man bash(Abschnitt "Parametererweiterung") für Details.

Francesco Turco
quelle
1

Nun, es war nicht so schwer wie ich.

$ for f in TestSR*.m; do mv $f CL$(echo $f | cut -c7-); done;
$ for f in TestSR*.h; do mv $f CL$(echo $f | cut -c7-); done;
ErikTJ
quelle
1
Wenn es für die Zukunft hilfreich ist, müssen Sie die Befehle für Ihre beiden Muster nicht wiederholen. Sie können (zum Beispiel) verwendet werden : for f in TestSR*.[mh], for f in TestSR*.{m,h}, for f in TestSR*.m TestSR*.h.
mrb
1

Wenn Sie etwas mehr perlish brauchen, können Sie dies tun

perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *
user1146332
quelle