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 -execdir
opcja robi cd
w katalogu a przed wykonaniem rename
polecenia, 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
PATH
Hacking jest wymagane, ponieważ -execdir
ma jeden bardzo przykry wadę: find
jest bardzo uparty i nie chce nic robić ze -execdir
jeśli masz żadnych ścieżek względnych w PATH
zmiennej ś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
-execdir
to rozszerzenie GNU do POSIX . rename
jest oparty na Perlu i pochodzi z rename
pakietu. Testowane w Ubuntu 18.10.
Zmień nazwę obejścia obejścia
Jeśli twoje ścieżki wejściowe nie pochodzą find
lub 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 -execdir
z xargs
: xargs: Zmiana katalogu roboczego do ścieżki pliku przed wykonaniem?
Jest sort -r
to 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.
rename
lub Red Hatrename
?