it-swarm.com.de

Benennen Sie mehrere Verzeichnisse in der Befehlszeile um

Ich habe einige Ordner namens:

Session 1
Session 2
Session 3
Session 4
Session 5
Session 6
Session 7
Session 8

Ich möchte sie alle umbenennen in:

Folder 1
Folder 2
Folder 3
Folder 4
Folder 5
Folder 6
Folder 7
Folder 8

Wie mache ich das am effektivsten im Terminal?

Ich weiß über mmvmv und rename Bescheid, bin mir aber nicht sicher, was ich verwenden soll und wie ich es machen soll.

2
Rtsne42

vorname

Am einfachsten wäre es, rename oder prename zu verwenden, ein Perl-Skript (wenn Sie ksh oder mksh Benutzer sind, hat diese Shell rename Aus Gründen der Konsistenz verwende ich prename, wenn Sie auf dieses Perl-Skript verweisen. Alternativ können Sie /usr/bin/rename (vollständiger Pfad zur ausführbaren Datei) aufrufen.

$ ls
Session 1/  Session 2/  Session 3/  Session 4/  Session 5/  Session 6/  Session 7/  Session 8/
$ prename 's/Session/Folder/' Session*/                                                                                  
$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/

Wenn Sie eine rekursive Suche benötigen oder sicherstellen möchten, dass Sie den richtigen Elementtyp finden (möglicherweise sind im Dateinamen auch Dateien mit dem Wort "Sitzung" enthalten), können Sie dies mit dem Dienstprogramm find kombinieren:

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/

$ find -maxdepth 1 -type d -name "Session *" -exec prename 's/Session/Folder/' {} \;                                      

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/

Etwas langwierig, vielleicht etwas überflüssig, funktioniert aber.

mv

Das kleine Problem bei mv ist, dass wir den Namen des Ziels jedes Mal ändern müssen, damit es für sich allein nicht das tun kann, was wir wollen. Dazu müssten wir es mit einigen anderen Werkzeugen kombinieren, z. B. den Werkzeugen find oder bash.

$ ls
Session 1/  Session 2/  Session 3/  Session 4/  Session 5/  Session 6/  Session 7/  Session 8/


$ for dir in Session*/ ; do mv "${dir}" "Folder ${dir##*\ }" ;done                                                       

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/

Was Sie hier sehen, ist, dass wir alle Elemente durchlaufen, die das Wort Session enthalten und Verzeichnisse sind. Wir verwenden die Parametererweiterung "$ {dir ## * \}", um alles nach dem Leerzeichen im Verzeichnisnamen (das ist die entsprechende Nummer) zu extrahieren und eine neue Zeichenfolge "Folder /" zu bilden.

In beiden Befehlen prename und mv verwenden wir Globbing, was bedeutet, dass diese Ansätze jedes Verzeichnis umbenennen, das das Wort "Session" enthält, sogar "Session blah". . Natürlich nicht ideal, aber für den speziellen Fall, dass Sie wissen, dass Ihre Ordnernamen konsistent sind, funktioniert dies. Alternativ könnten wir den Befehl mit for dir in Session\ [1-9] ; do . . .done erweitern.

Mit anderen Worten, dieser Ansatz kann funktionieren, ist jedoch sehr simpel und nicht der beste.

Python

Natürlich können auch andere Tools verwendet werden. Zum Beispiel Python:

$ ls
Session 1/  Session 3/  Session 5/  Session 7/
Session 2/  Session 4/  Session 6/  Session 8/

$ python -c 'import os,shutil;map(lambda x:shutil.move(x,x.replace("Session","Folder")),os.listdir("."))'                

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/
9

Gehen Sie zu dem Ordner, der alle Ordner enthält, die Sie umbenennen möchten, und führen Sie folgende Schritte aus:

find . * | rename 's\Session\Folder\'
0