Ich arbeite in meinem Terminal mit Bash und versuche, die Ordner umzubenennen:
1
2
3
4
5
Ich möchte sie gemäß a.txt-Datei umbenennen:
a 2
c 3
d 5
e 1
b 4
Die Reihenfolge in der TXT-Datei ist völlig zufällig. Ich hoffe, einen Weg zu finden, wie ich den Ordner umbenennen kann, damit sie werden:
1 > e
2 > a
3 > c
4 > b
5 > d
Gibt es eine Möglichkeit, dies zu tun?
Vielen Dank!
command-line
bash
files
rename
Ditte
quelle
quelle
Antworten:
Angenommen, die Namen in der Liste enthalten keine Leerzeichen außer zwischen den Namen, benennt das folgende Skript Ordner aus einer Textdatei rekursiv um . Es liest die Zeilen der Datei, teilt sie in zwei (neuer Name, alter Name) auf und benennt vorkommende Ordner, die durch die zweite Zeichenfolge in der Zeile benannt sind, in die erste Zeichenfolge in der Zeile um.
Dies geschieht , wie rekursiv erwähnt , von unten nach oben im Verzeichnisbaum. Dies verhindert Probleme im Skript und versucht, Ordner in möglicherweise bereits umbenannten übergeordneten Ordnern umzubenennen.
Wie benutzt man
rename.py
Führen Sie es mit dem Befehl (in einem Terminal) aus:
Erläuterung
Das Skript:
os.walk()
es Ihre Verzeichnisse rekursiv von unten nach oben.quelle
Sie könnten verwenden
xargs
mitmv
:(Vorausgesetzt, Sie befinden sich in dem Verzeichnis, in dem sich die Dateien befinden).
xargs
konvertiert Eingaben in Argumente für einen Befehl.-a foo
Eingabe von lesenfoo
.-L1
um genau eine Eingabezeile pro Befehlsaufruf zu verwenden.-r
um zu vermeiden, dass der Befehl ausgeführt wird, wenn die Zeile leer istVerwenden Sie beispielsweise
echo mv
anstelle vonmv
, um die ausgeführten Befehle anzuzeigen:Sie können auch die
-p
Option verwenden, umxargs
vor dem Ausführen des Befehls eine Bestätigung vorzunehmen :quelle
Es gibt einen Eintrag pro Zeile in der
a.txt
Datei, daher enthalten die aufgelisteten Namen kein Zeichen\n
(neue Zeile), oder?Eine Zeile enthält 2 Namen, die durch ein Leerzeichen getrennt sind. Die Namen enthalten also kein Leerzeichen , oder? (oder eine andere Möglichkeit wäre, eine feste Länge für die aufgelisteten Namen zu verwenden).
Probieren Sie es aus, wenn die Namen weder Zeichen
\n
nochspace
Zeichen enthalten:awk
wird verwendet, um die Reihenfolge der Namen in aus dera.txt
Datei gelesenen Zeilen umzukehren .\0
wird verwendet, um die Namen zu trennen, wenn sie in der Standardausgabe gedruckt werden.xargs
liest die Standardeingabe:-0
:\0
wird als Trennzeichen für die aus der Standardeingabe gelesenen Elemente verwendet-L 2 mv
Dermv
Befehl : wird mit jeweils 2 Parametern aufgerufen.Die Prüfung:
quelle
In dem oben gezeigten einfachen Fall, in dem jede Zeile zwei "Wörter" enthält, das Zielverzeichnis und den neuen Namen, und in dem keine Leerzeichen enthalten können, können Sie einfach Folgendes tun:
Dadurch wird jede Zeile gelesen, in der
file
die erste Zeichenfolge (bis zum ersten Leerzeichen)$from
und der Rest der Zeile zugewiesen$to
und dannmv
auf jeder Zeile ausgeführt wird .quelle