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 -execdirals cdbei der Option " awesome " wird vor dem Ausführen des renameBefehls 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 PATHHacken ist erforderlich, da -execdires einen sehr ärgerlichen Nachteil hat: Es findist äußerst kritisch und weigert sich, irgendetwas damit zu tun, -execdirwenn Sie relative Pfade in Ihrer PATHUmgebungsvariablen 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
-execdirist eine GNU find Erweiterung zu POSIX . renameist Perl-basiert und stammt aus dem renamePaket. Getestet in Ubuntu 18.10.
Benennen Sie die Lookahead-Problemumgehung um
Wenn Ihre Eingabepfade nicht von stammen findoder 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 -execdirmit gefunden xargs: Xargs: Arbeitsverzeichnis vor der Ausführung in Dateipfad ändern?
Das sort -rist erforderlich, um sicherzustellen, dass Dateien nach ihren jeweiligen Verzeichnissen kommen, da längere Pfade nach kürzeren mit demselben Präfix kommen.
renameoder Red Hatrename?