¿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.gzes 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
echopara 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
perlbaserename\.[^.]+$(*SKIP)(*F)omita este patrón y busque coincidencias alternativas|\./_/greemplazar todo.con_O, usando anticipación negativa
Una vez que esto esté bien, elimine la
-nopció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
renameparece 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$oldentre 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_xtse renombra ahead_body_date_t.xt.Usando
mv,sedyreven una línea:Si desea aplicarlo en todos los
txtarchivos en el representante actual, usar globs parece complicado debido a cómomvfunciona, pero puede hacer unforbucle 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" "$(…)".renamecomo 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