Rinominare file e directory con find -execdir | rename
Se hai intenzione di rinominare file e directory non semplicemente con un suffisso, allora questo è un buon modello:
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find . -depth -execdir rename 's/findme/replaceme/' '{}' \;
La fantastica -execdir
opzione fa un cd
nella directory prima di eseguire il rename
comando, a differenza -exec
.
-depth
assicurarsi che la ridenominazione avvenga prima sui bambini e poi sui genitori, per evitare potenziali problemi con le directory dei genitori mancanti.
-execdir
è necessario perché la ridenominazione non viene riprodotta correttamente con percorsi di input senza nome di base, ad esempio i seguenti errori:
rename 's/findme/replaceme/g' acc/acc
L' PATH
hacking è necessario perché -execdir
ha uno svantaggio molto fastidioso: find
è estremamente supponente e si rifiuta di fare qualsiasi cosa -execdir
se ci sono percorsi relativi nella PATH
variabile di ambiente, ad esempio ./node_modules/.bin
, non riuscendo con:
find: il percorso relativo './node_modules/.bin' è incluso nella variabile d'ambiente PATH, che non è sicura in combinazione con l'azione -execdir di find. Rimuovi quella voce da $ PATH
Vedi anche: https://askubuntu.com/questions/621132/why-using-the-execdir-action-is-insecure-for-directory-which-is-in-the-path/1109378#1109378
-execdir
è un'estensione di ricerca GNU a POSIX . rename
è basato su Perl e proviene dal rename
pacchetto. Testato su Ubuntu 18.10.
Rinomina soluzione alternativa lookahead
Se i tuoi percorsi di input non provengono find
o se hai abbastanza del fastidio relativo del percorso, possiamo usare alcuni lookahead Perl per rinominare in modo sicuro le directory come in:
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
Non ho trovato un analogo conveniente per -execdir
con xargs
: Xargs: cambia la directory di lavoro nel percorso del file prima di eseguire?
Il sort -r
è tenuto a garantire che i file vengono dopo rispettive directory, dal momento che i percorsi più lunghi vengono dopo quelle più corte con lo stesso prefisso.
rename
o Red Hatrename
?