Zmień nazwy plików i katalogów za pomocą find -execdir | rename
Jeśli zamierzasz zmienić nazwę zarówno plików, jak i katalogów, nie tylko za pomocą przyrostka, to jest to dobry wzorzec:
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find . -depth -execdir rename 's/findme/replaceme/' '{}' \;
Niesamowita -execdiropcja robi cdw katalogu a przed wykonaniem renamepolecenia, w przeciwieństwie do -exec.
-depth upewnij się, że zmiana nazwy nastąpi najpierw dla dzieci, a następnie dla rodziców, aby zapobiec potencjalnym problemom z brakującymi katalogami rodziców.
-execdir jest wymagane, ponieważ zmiana nazwy nie działa dobrze w przypadku ścieżek wejściowych innych niż basename, np. nie działa:
rename 's/findme/replaceme/g' acc/acc
PATHHacking jest wymagane, ponieważ -execdirma jeden bardzo przykry wadę: findjest bardzo uparty i nie chce nic robić ze -execdirjeśli masz żadnych ścieżek względnych w PATHzmiennej środowiskowej, na przykład ./node_modules/.bin, w przypadku braku z:
find: ścieżka względna „./node_modules/.bin” jest zawarta w zmiennej środowiskowej PATH, która nie jest bezpieczna w połączeniu z działaniem -execdir funkcji find. Usuń ten wpis z $ PATH
Zobacz także: /ubuntu/621132/why-using-the-execdir-action-is-insecure-for-directory-which-is-in-the-path/1109378#1109378
-execdirto rozszerzenie GNU do POSIX . renamejest oparty na Perlu i pochodzi z renamepakietu. Testowane w Ubuntu 18.10.
Zmień nazwę obejścia obejścia
Jeśli twoje ścieżki wejściowe nie pochodzą findlub jeśli masz dość relatywnej irytacji ścieżki, możemy użyć Perla lookahead, aby bezpiecznie zmienić nazwy katalogów jak w:
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
Nie znalazłem dogodnym dla analogowych -execdirz xargs: xargs: Zmiana katalogu roboczego do ścieżki pliku przed wykonaniem?
Jest sort -rto konieczne, aby upewnić się, że pliki następują po odpowiednich katalogach, ponieważ dłuższe ścieżki pojawiają się po krótszych z tym samym prefiksem.
renamelub Red Hatrename?