Tengo un grupo de archivos que tienen :
(dos puntos) dentro del nombre. Necesito reemplazar el :
con -
(guión).
¿Hay una manera fácil de hacer esto en un script?
Nombre de archivo de muestra: 2013-10-11:11:52:08_055456663_045585_.txt
Un simple 1-liner debería hacer (asume un sh
shell compatible con Posix ):
for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
Explicación:
for ... in ...; do ...; done
es un bucle
*:*
coincide con todos los archivos y directorios en el directorio actual que tienen :
en su nombre
f
se asigna a su vez a cada nombre de archivo en el bucle
mv
cambia el nombre de su primer argumento al segundo; -v
(detallado) le pide que imprima lo que hace; Esta opción es específica de GNU-utils , por lo que está disponible en Linux pero no en Solaris
$(...)
ejecuta el código en un sub-shell y sustituye la salida
echo
imprime su argumento a la salida estándar
tr
lee la salida estándar y traduce los caracteres de acuerdo con el mapa proporcionado
Si está utilizando bash , puede evitar generar un shell adicional ( $()
) con subprocesos ( tr
) reemplazándolo $(...)
con ${f//:/-}
.
for f in
ciclo ... es un ciclo que itera sobre todos los archivos en el directorio actual donde los archivos deben coincidir*:*
. (¿Qué sucede con los directorios que coinciden?). El comando move es move oldname newname donde se genera el nuevo nombre ejecutando un shell con$( subshell here )
. Lo que hace, ...$(echo "$f" | tr ':' '-')
con"${f//:/-}"
y evitar la llamada de subprograma, canalización y programa externo. Creo que esto es un bashismo, pero eh. Vea aquí .Como dije en otra publicación, la
rename
herramienta podría hacer el truco por ti. Solo necesita escribirrename s/:/-/ <files to rename>
Esto reemplaza cada punto y coma con un guión en todos los archivos que nombre al final, es decir2013-10-*
Aquí está el enlace a mi otra publicación
fuente
Estoy seguro de que un profesional de UNIX podría hacer esto con bash, pero aquí está mi versión rápida y sucia con ruby.
establezca path_to_files en la ruta a sus archivos con nombre incorrecto. guarde el código anterior en un archivo llamado rename.rb y luego:
fuente
Si solo tiene uno o unos pocos archivos, esto puede cambiarle el nombre:
p="201*"
.old_name=$(ls | grep $p)
.Almacene el nuevo nombre de archivo con los reemplazos de caracteres necesarios:
Bono de limpieza :
a. Si por razones de uniformidad desea reemplazar los guiones (
-
) junto con los dos puntos (:
) con guiones bajos (_
), puede hacer esto:si. Si desea que el último guión bajo (justo antes del
.txt
) desaparezca también, configure lanew_name
variable como:mv $old_name $new_name
NB:
mv
fallará si alguno de los nombres de archivo en la operación de cambio de nombre tienespaces
. En ese caso, ajuste las variables apropiadas entre comillas, como:mv "$old_name" $new_name
Omv $old_name "$new_name"
Omv "$old_name" "$new_name"
One-liners
fuente
usando renamer :
fuente
rename
es una herramienta que está preinstalada en muchas distribuciones de Linux. Pero creo que para Windows esta herramienta puede ser genial.Esto puede ser excesivo, pero puede cambiar el nombre de cualquier carácter especial con el script en el enlace proporcionado en esta respuesta:
/superuser//a/858671/365691
fuente