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 ".
rename
comando. Sospecho que tu cambio de nombre sería tan simple comorename -n 's/#/safeNBC/' *.jpg
.rename -n 's/#U00a9/safe/' *.jpg
y el comando fue aceptado pero no se produjeron cambios.-n
es lano act
opció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
#
porsomethingelse
nombres 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
-n
bandera:Para OS X, GNU cambio de nombre se puede instalar utilizando homebrew :
brew install rename
.fuente
rename
estás usando?# sudo pacman -S perl-rename
instalará la versión perl, que es más potente y podría ser suficiente para que esta respuesta funcione para usted.rename --version
regresa ,rename from util-linux 2.29.2
por lo que esa no es la versión perl.rename
utilidades comunes, pero ninguna de ellas está desarrollada por GNU: las distribuciones basadas en Debian incluyen unarename
utilidad con su paquete Perl, mientras que las distribuciones basadas en Red Hat usan larename
utilidad de lautil-linux
Organización Kernel de Linux. Su enlace es a la funciónrename
C de la biblioteca estándar GNU./g
enrename 's/#U00a9/safe/g' *
encuentre la lista de archivos y luego reemplace la palabra clave. a continuación se muestra un ejemplo
fuente
mv
argumentos, 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
rename
comando (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
/g
inrename 's/old_string/new_string/g'
(planteado en los comentarios para otra respuesta anterior):Use el
g
modificador 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 porquerename
se 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
rename
sistemas 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
rename
tiene una opción exactamente para eso llamado--subst
o-s
en resumen. No es necesario utilizar la sintaxis de expresiones regulares.Si desea reemplazar / sustituir múltiples ocurrencias, use
--subst-all
o-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/--delete
y-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 pyrenamer
Para obtener detalles de uso, consulte su archivo README en GitHub .
fuente