¿Alguien puede sugerir cómo cambiar el nombre del archivo:
head.body.date.txt
A:
head_body_date.txt
¿Hay una declaración de una sola línea para cambiar el nombre en Unix ?
¿Alguien puede sugerir cómo cambiar el nombre del archivo:
head.body.date.txt
A:
head_body_date.txt
¿Hay una declaración de una sola línea para cambiar el nombre en Unix ?
.tar.gz
es una extensión? Además, ¡bienvenido a U&L!mv head.body.date.txt head_body_date.txt
. Si tiene otras restricciones o ejemplos reales, actualice su pregunta con estos. Tal como está ahora, no está claro si la pregunta se refiere a un archivo con ese nombre explícito, un único directorio donde todos los archivos tienen un formato particular, o si desea buscar en una jerarquía de directorios nombres particulares y cambiarlos.Respuestas:
Iterar sobre los nombres de archivo y usar la expansión de parámetros para la conversión:
El patrón de expansión de parámetros
${f//./_}
reemplaza todas las.
s con_
s en el nombre del archivo ($f
).Lo anterior hará una ejecución en seco, para permitir que tenga lugar el cambio de nombre real, elimine
echo
:Si desea lidiar con cualquier extensión, no solo
.txt
:Después de marcar eliminar
echo
para la acción real:Genérico, para un número arbitrario de puntos, al menos uno:
fuente
for f in *.*; do ...; done
*.*
patrón directamente en el ejemplo, ya que ahora parece que el código funciona solo con un número fijo de puntos.con
perl
baserename
\.[^.]+$(*SKIP)(*F)
omita este patrón y busque coincidencias alternativas|\./_/g
reemplazar todo.
con_
O, usando anticipación negativa
Una vez que esto esté bien, elimine la
-n
opciónfuente
Utiliza el reemplazo de expresiones regulares para encontrar todo menos la última instancia del
.
nombre de archivo (búsqueda anticipada sin captura) y reemplazarlos con_
. Generaliza a*.*
si te gusta.(esta versión particular de
rename
parece estar instalada a través deutil-linux
). Estoy usandoUbuntu 12.04
(sí, máquina muy desactualizada).fuente
bash
:fuente
mv --
, para protegerse de los nombres de archivo "antiguos" que comienzan con-
. (2) Debe poner$old
entre comillas ("$old"
), para protegerse contra los nombres de archivo "antiguos" que contienen espacios o caracteres que son especiales para el shell (como*
y?
). (3) Su respuesta falla en el caso algo patológico en el que la extensión contiene un guión bajo:head.body.date.t_xt
se renombra ahead_body_date_t.xt
.Usando
mv
,sed
yrev
en una línea:Si desea aplicarlo en todos los
txt
archivos en el representante actual, usar globs parece complicado debido a cómomv
funciona, pero puede hacer unfor
bucle en una línea:¡Un poco más largo, pero puedes combinar varios patrones en tu bucle!
fuente
$(ls …)
; solo hazlofor file in *.txt
. (2) Se debe utilizar más citas:mv "$file" "$(…)"
.rename
como muchos otros han sugerido en sus respuestas parece más simple ...Es tan simple como eso para un solo archivo a la vez. No especifica si desea que esto se haga recursivamente dentro de un directorio o en todo el directorio, por lo que sería su solución más conveniente y rápida.
fuente