Ich habe eine Verzeichnisstruktur wie diese:
Bookname Edition 1
Bookname Edition 1 type1.pdf
Bookname Edition 1 type2.pdf
Bookname Edition 2
Bookname Edition 2 type1.pdf
Bookname Edition 2 type2.pdf
Ich möchte rekursiv den Namen ändern aus , Edition
um Volume
aus dem Verzeichnis und den Dateinamen in diesen Verzeichnissen.
Ich habe damit angefangen und das ist in Ordnung, wenn ich im Verzeichnis bin:
for f in *.pdf; do
a="$(echo $f | sed s/Edition/Volume/)"
mv "$f" "$a"
done
Dann habe ich versucht, alle Dateien unter den Verzeichnissen zu ändern, und dann blieb ich stecken ...
Können Sie mir bitte sagen, wie das geht, oder mir einen besseren Weg geben, das zu tun? Es gibt 15000 PDFs in 100 Verzeichnissen.
command-line
scripts
sed
batch-rename
mv
Bischof
quelle
quelle
for
Schleife würde ich annehmen, dass nichts passiert ist, aber ich möchte bestätigen.Antworten:
Wenn Ihre Struktur nur zwei Ebenen hat, müssen Sie keine Rekursion verwenden.
Analysieren Sie keine Dateinamen mit
sed
. Wenn Sie Regex undsed
Stilsyntax zum Umbenennen von Dateien verwenden möchten , verwenden Sierename
. Wenn Sie Ubuntu 17.10 verwenden, müssen Sie es installierenDann können Sie die Antwort von pa4080 verwenden .
Mit
rename
, verwenden Sie die-n
Option zum Testen.Sie können auch einfach den
mv
Befehl verwenden. Als einzeiliger Befehl:Sie können
echo
zum Testen mit verwendenmv
, dhecho mv -v source dest
es werden hier ungenaue Ergebnisse angezeigt, es sei denn, Sie testen die Schleifen und führen sie dann separat aus.Als Skript:
mv
undrename
erkennen--
, um das Ende der Optionen anzuzeigen. Da./
in diesem Beispiel alle Pfade mit beginnen , müssen wir dies nicht verwenden. Wenn jedoch Pfade beginnen dürfen-
, verwenden Sie diese--
am Ende von Optionen, z. B. umrename -n -- 's/foo/bar/' *
zu verhindern, dass diese Pfade als Optionen interpretiert werden.quelle
Sie können den Befehl
rename
zweimal verwenden, um diese Aufgabe auszuführen:Hier sind zwei ähnliche Fragen:
quelle
Bei mehrstufigen Verzeichnissen können Sie dies in einem Schritt tun. Das Problem besteht jedoch darin, dass Sie sicherstellen müssen, dass die Verzeichnisse von unten nach oben umbenannt werden, um zu verhindern, dass der Befehl oder das Skript den Verzeichnisnamen ändert, bevor der Inhalt geändert wird.
In Python können Sie Folgendes verwenden:
in Kombination mit
In einem Skript:
Speichern Sie das Skript unter
change_name.py
und führen Sie es mit dem Verzeichnis als Argument aus:Dies funktioniert rekursiv auf einer beliebigen Anzahl von Ebenen.
quelle
os.path.join
Zeichenfolgen verwenden, anstatt sie mit zu verketten"/"
.Verwendung
find
mit der-depth
Option kombiniert mitprename
:Erläuterung:
-depth
Wählt Verzeichniskinder vor ihren Eltern aus. Ein Tool, das die ausgewählten Pfadnamen zum Umbenennen „verbraucht“, kann dann Kinder vor ihren Eltern umbenennen.s|Edition(?=[^/]*$)|Volume|
Ersetzt das erste VorkommenEdition
im Pfadnamen durch,Volume
aber nur, wenn der Rest kein a enthält/
, dh nur für die letzte Pfadnamenkomponente (erreicht durch die positive Vorausschau(?=[^/]*$)
).-n
weistprename
an, die Pfade nicht tatsächlich umzubenennen, sondern zu drucken, wie sie umbenannt werden sollen. Entfernen Sie diese Option, um sie tatsächlich umzubenennen.quelle