Renombrar archivos y directorios con find -execdir | rename
Si va a cambiar el nombre de los archivos y directorios no simplemente con un sufijo, entonces este es un buen patrón:
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find . -depth -execdir rename 's/findme/replaceme/' '{}' \;
La -execdiropción impresionante hace un cden el directorio antes de ejecutar el renamecomando, a diferencia de -exec.
-depth asegúrese de que el cambio de nombre ocurra primero en los niños y luego en los padres, para evitar posibles problemas con la falta de directorios principales.
-execdir es necesario porque el cambio de nombre no funciona bien con las rutas de entrada que no son de nombre base, por ejemplo, lo siguiente falla:
rename 's/findme/replaceme/g' acc/acc
El PATHpirateo es obligatorio porque -execdirtiene un inconveniente muy molesto: findes extremadamente obstinado y se niega a hacer nada -execdirsi tiene alguna ruta relativa en su PATHvariable de entorno, por ejemplo ./node_modules/.bin, no:
find: la ruta relativa './node_modules/.bin' se incluye en la variable de entorno PATH, que es insegura en combinación con la acción -execdir de find. Elimina esa entrada de $ PATH
Ver también: /ubuntu/621132/why-using-the-execdir-action-is-insecure-for-directory-which-is-in-the-path/1109378#1109378
-execdires una extensión de búsqueda de GNU para POSIX . renameestá basado en Perl y proviene del renamepaquete. Probado en Ubuntu 18.10.
Cambiar el nombre de la solución alternativa anticipada
Si sus rutas de entrada no provienen find, o si ha tenido suficiente de la molestia relativa de la ruta, podemos usar algunas anticipaciones de Perl para cambiar el nombre de los directorios de manera segura como en:
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
No he encontrado un análogo conveniente para -execdircon xargs: Xargs: ¿cambiar el directorio de trabajo a la ruta del archivo antes de ejecutar?
Se sort -rrequiere para garantizar que los archivos vengan después de sus respectivos directorios, ya que las rutas más largas vienen después de las más cortas con el mismo prefijo.
renameo Red Hatrename?