find -execdir rename
https://stackoverflow.com/a/16541670/895245 funktioniert direkt nur für Suffixe, dies funktioniert jedoch für willkürliche Regex-Ersetzungen für Basisnamen:
PATH=/usr/bin find . -depth -execdir rename 's/_dbg.txt$/_.txt' '{}' \;
oder nur Dateien betreffen:
PATH=/usr/bin find . -type f -execdir rename 's/_dbg.txt$/_.txt' '{}' \;
-execdir
Zuerst cd
s in das Verzeichnis, bevor nur der Basisname ausgeführt wird.
Getestet unter Ubuntu 20.04, finde 4.7.0, benenne 1.10 um.
Bequemer und sicherer Helfer dafür
find-rename-regex() (
set -eu
find_and_replace="$1"
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find . -depth -execdir rename "${2:--n}" "s/${find_and_replace}" '{}' \;
)
GitHub stromaufwärts .
Beispiel für die Verwendung von Leerzeichen '' durch Bindestriche '-'.
Trockenlauf, der zeigt, was in was umbenannt werden würde, ohne es tatsächlich zu tun:
find-rename-regex ' /-/g'
Ersetzen Sie:
find-rename-regex ' /-/g' -v
Befehlserklärung
Die fantastische -execdir
Option führt im Gegensatz zum cd
Ausführen eines rename
Befehls vor der Ausführung des Befehls ein Verzeichnis durch -exec
.
-depth
Stellen Sie sicher, dass die Umbenennung zuerst bei Kindern und dann bei Eltern erfolgt, um mögliche Probleme mit fehlenden Elternverzeichnissen zu vermeiden.
-execdir
ist erforderlich, da das Umbenennen mit 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 eigensinnig 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 für POSIX . rename
ist Perl-basiert und kommt aus dem rename
Paket.
Benennen Sie die Lookahead-Problemumgehung um
Wenn Ihre Eingabepfade nicht von stammen find
oder wenn Sie genug von der relativen Pfadstörung haben, können wir einige Perl-Lookaheads verwenden, um Verzeichnisse wie folgt sicher umzubenennen:
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
Ich habe kein passendes Analogon für gefunden -execdir
mit xargs
: /superuser/893890/xargs-change-working-directory-to-file-path-before-executing/915686
Dies sort -r
ist erforderlich, um sicherzustellen, dass Dateien nach ihren jeweiligen Verzeichnissen kommen, da längere Pfade nach kürzeren mit demselben Präfix folgen.
Getestet in Ubuntu 18.10.
Bareword "..." not allowed while "strict subs" in use at (eval 1) line 1.