Respuestas:
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//:/-}
.
Como dije en otra publicación, la rename
herramienta podría hacer el truco por ti. Solo necesita escribir
rename 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
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.
path_to_files = "/home/username/wrongnames/"
filenames = `ls #{path_to_files}`.split
filenames.each do |fn|
`mv #{path_to_files + fn} #{path_to_files + fn.gsub(/:/, "-")}`
end
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:
username@machinename$ ruby rename.rb
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:
new_name=$(ls | grep $p | sed 's/:/_/g') # Using 'sed'
OR
new_name=$(ls | grep $p | tr ':' '_') # Using 'tr'
Bono de limpieza :
a. Si por razones de uniformidad desea reemplazar los guiones (-
) junto con los dos puntos (:
) con guiones bajos (_
), puede hacer esto:
new_name=$(ls | grep $p | tr ':-' '_');
si. Si desea que el último guión bajo (justo antes del .txt
) desaparezca también, configure la new_name
variable como:
new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
mv $old_name $new_name
NB: mv
fallará si alguno de los nombres de archivo en la operación de cambio de nombre tiene spaces
. En ese caso, ajuste las variables apropiadas entre comillas, como: mv "$old_name" $new_name
O mv $old_name "$new_name"
O mv "$old_name" "$new_name"
1a: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | sed 's/:/_/g'); mv $old_name $new_name
1b: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':' '_'); mv $old_name $new_name
2: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_'); mv $old_name $new_name
3: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./'); mv $old_name $new_name
usando renamer :
$ renamer --find ":" --replace "-" *
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:
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, ...