Benennen Sie Dateien und Verzeichnisse mit find -execdir | rename
Wenn Sie Dateien und Verzeichnisse nicht einfach mit einem Suffix umbenennen, ist dies ein gutes Muster:
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find . -depth -execdir rename 's/findme/replaceme/' '{}' \;
Anders -execdir
als cd
bei der Option " awesome " wird vor dem Ausführen des rename
Befehls ein Eintrag in das Verzeichnis erstellt -exec
.
-depth
Stellen Sie sicher, dass die Umbenennung zuerst bei Kindern und dann bei Eltern erfolgt, um potenzielle Probleme mit fehlenden Elternverzeichnissen zu vermeiden.
-execdir
ist erforderlich, weil das Umbenennen bei Eingabepfaden ohne Basisnamen nicht gut funktioniert, z. B. schlägt Folgendes fehl:
rename 's/findme/replaceme/g' acc/acc
Das PATH
Hacken ist erforderlich, da -execdir
es einen sehr ärgerlichen Nachteil hat: Es find
ist äußerst kritisch und weigert sich, irgendetwas damit zu tun, -execdir
wenn Sie relative Pfade in Ihrer PATH
Umgebungsvariablen haben, z ./node_modules/.bin
.
find: Der relative Pfad './node_modules/.bin' ist in der Umgebungsvariablen PATH enthalten, die in Kombination mit der Aktion -execdir von find unsicher ist. Bitte entfernen Sie diesen Eintrag aus $ PATH
Siehe auch: /ubuntu/621132/why-using-the-execdir-action-is-insecure-for-directory-which-is-in-the-path/1109378#1109378
-execdir
ist eine GNU find Erweiterung zu POSIX . rename
ist Perl-basiert und stammt aus dem rename
Paket. Getestet in Ubuntu 18.10.
Benennen Sie die Lookahead-Problemumgehung um
Wenn Ihre Eingabepfade nicht von stammen find
oder wenn Sie genug von der relativen Pfadbelästigung haben, können wir einige Perl-Lookaheads verwenden, um Verzeichnisse sicher umzubenennen, wie in:
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
Ich habe keine passende Entsprechung für -execdir
mit gefunden xargs
: Xargs: Arbeitsverzeichnis vor der Ausführung in Dateipfad ändern?
Das sort -r
ist erforderlich, um sicherzustellen, dass Dateien nach ihren jeweiligen Verzeichnissen kommen, da längere Pfade nach kürzeren mit demselben Präfix kommen.
rename
oder Red Hatrename
?