https://serverfault.com/questions/70939/how-to-replace-a-text-string-in-multiple-files-in-linux
https://serverfault.com/questions/228733/how-to-rename-multiple-files-by-replacing-word-in-file-name
https://serverfault.com/questions/212153/replace-string-in-files-with-certain-file-extension
https://serverfault.com/questions/33158/searching-a-number-of-files-for-a-string-in-linux
Estos artículos mencionados han respondido a mi pregunta. Sin embargo, ninguno de ellos funciona para mí. Sospecho que es porque la cadena que estoy tratando de reemplazar tiene un # en ella. ¿Hay alguna forma especial de abordar esto?
Tengo un archivo de imagen que tuvo un é reemplazado por # U00a9 durante una migración del sitio. Estos se ven así:
Lucky-#U00a9NBC-80x60.jpg
Lucky-#U00a9NBC-125x125.jpg
Lucky-#U00a9NBC-150x150.jpg
Lucky-#U00a9NBC-250x250.jpg
Lucky-#U00a9NBC-282x232.jpg
Lucky-#U00a9NBC-300x150.jpg
Lucky-#U00a9NBC-300x200.jpg
Lucky-#U00a9NBC-300x250.jpg
Lucky-#U00a9NBC-360x240.jpg
Lucky-#U00a9NBC-400x250.jpg
Lucky-#U00a9NBC-430x270.jpg
Lucky-#U00a9NBC-480x240.jpg
Lucky-#U00a9NBC-600x240.jpg
Lucky-#U00a9NBC-600x250.jpg
Lucky-#U00a9NBC.jpg
y quiero cambiarlo a algo como esto:
Lucky-safeNBC-80x60.jpg
Lucky-safeNBC-125x125.jpg
Lucky-safeNBC-150x150.jpg
Lucky-safeNBC-250x250.jpg
Lucky-safeNBC-282x232.jpg
Lucky-safeNBC-300x150.jpg
Lucky-safeNBC-300x200.jpg
Lucky-safeNBC-300x250.jpg
Lucky-safeNBC-360x240.jpg
Lucky-safeNBC-400x250.jpg
Lucky-safeNBC-430x270.jpg
Lucky-safeNBC-480x240.jpg
Lucky-safeNBC-600x240.jpg
Lucky-safeNBC-600x250.jpg
Lucky-safeNBC.jpg
ACTUALIZAR:
Todos estos ejemplos comienzan con "LU00a9ucky pero aquí hay muchas imágenes con diferentes nombres. Simplemente estoy apuntando a la parte" # U00a9 "de la cadena para reemplazarla por" segura ".

renamecomando. Sospecho que tu cambio de nombre sería tan simple comorename -n 's/#/safeNBC/' *.jpg.rename -n 's/#U00a9/safe/' *.jpgy el comando fue aceptado pero no se produjeron cambios.-nes lano actopción. Lo que le permite ver si funciona antes de usarlo realmente. ¿La salida en la pantalla muestra los posibles nombres nuevos correctamente?Respuestas:
Para reemplazar
#porsomethingelsenombres de archivo en el directorio actual (no recursivo) puede usar la utilidad de cambio de nombre GNU :Los personajes como
-deben escapar con a\.Para su caso, desearía usar
Tenga en cuenta que si solo desea operar en una determinada selección de archivos, por ejemplo, solo
*.jpg, ajuste la entrada final para que coincida con esa selección:Para realizar una prueba antes de cambiar realmente los nombres de archivo, use la
-nbandera:Para OS X, GNU cambio de nombre se puede instalar utilizando homebrew :
brew install rename.fuente
renameestás usando?# sudo pacman -S perl-renameinstalará la versión perl, que es más potente y podría ser suficiente para que esta respuesta funcione para usted.rename --versionregresa ,rename from util-linux 2.29.2por lo que esa no es la versión perl.renameutilidades comunes, pero ninguna de ellas está desarrollada por GNU: las distribuciones basadas en Debian incluyen unarenameutilidad con su paquete Perl, mientras que las distribuciones basadas en Red Hat usan larenameutilidad de lautil-linuxOrganización Kernel de Linux. Su enlace es a la funciónrenameC de la biblioteca estándar GNU./genrename 's/#U00a9/safe/g' *encuentre la lista de archivos y luego reemplace la palabra clave. a continuación se muestra un ejemplo
fuente
mvargumentos, en caso de que haya espacios en el nombreEsto no es difícil, simplemente asegúrese de escapar del octothorpe (#) en el nombre anteponiendo una barra invertida (\).
fuente
#sonidos como lo que necesito. No veo una barra diagonal inversa en su ejemplo. Debería verse así:s/\#U00a9/safe/Para escapar
#del shell, solo use comillas simples ('#'), comillas dobles ("#") o barra invertida (\#).Lo más simple en su caso sería usar el
renamecomando (si está disponible):fuente
rename 's/#/somethingelse/' *) no funcionó en mi máquina (Arch Linux), esta sí.no estoy seguro de cómo hacerlo, pero puedes probar esto en un bash shell:
explicación:
Más información sobre la sustitución de parámetros (que es una OMI altamente infrautilizada): http://www.tldp.org/LDP/abs/html/parameter-substitution.html
fuente
Los ejemplos anteriores no funcionaban en mi sistema (CentOS 5.6), así que encontré un comando (posiblemente más específico del sistema) que funciona (nota: necesita escapar '#' con
\en la línea de comando)rename \#U00a9 safe *.jpg[Además: todavía no tengo suficiente reputación para comentar, así que en respuesta a la pregunta de Nikhil sobre el uso de
/ginrename 's/old_string/new_string/g'(planteado en los comentarios para otra respuesta anterior):Use el
gmodificador para realizar una sustitución 'global' (es decir, para sustituir new_string por old_string tantas veces como old_string ocurra). Esto no debería ser necesario en mi respuesta porquerenamese aplicará a todos los archivos especificados con*. Consulte https://www.computerhope.com/unix/rename.htm para obtener una explicación concisa de este y otros modificadores.]fuente
renamesistemas operativos derivados de Debian. Ver unix.stackexchange.com/a/238862/135943 . Y, por cierto, CentOS 5.6 es bastante antiguo y le recomiendo que actualice.Aquí está la solución de DTK envuelta en la función bash reutilizable:
Así es como puedes usarlo:
fuente
En realidad
renametiene una opción exactamente para eso llamado--substo-sen resumen. No es necesario utilizar la sintaxis de expresiones regulares.Si desea reemplazar / sustituir múltiples ocurrencias, use
--subst-allo-S.Por cierto, solo quería reemplazar una cadena por nada (eliminarla del nombre del archivo) ... bueno, también tenemos una opción para ello
-d/--deletey-D/--delete-all:fuente
Otra opción es usar
pyRenamer, una aplicación hecha específicamente para renombrar lotes.Se puede instalar con
sudo apt-get install pyrenamerPara obtener detalles de uso, consulte su archivo README en GitHub .
fuente