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 -execdir
opción impresionante hace un cd
en el directorio antes de ejecutar el rename
comando, 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 PATH
pirateo es obligatorio porque -execdir
tiene un inconveniente muy molesto: find
es extremadamente obstinado y se niega a hacer nada -execdir
si tiene alguna ruta relativa en su PATH
variable 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
-execdir
es una extensión de búsqueda de GNU para POSIX . rename
está basado en Perl y proviene del rename
paquete. 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 -execdir
con xargs
: Xargs: ¿cambiar el directorio de trabajo a la ruta del archivo antes de ejecutar?
Se sort -r
requiere 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.
rename
o Red Hatrename
?