Tengo un repertorio donde algunos de los archivos deben ser renombrados:

alabama.txt   california1.txt   california2.txt   california3.txt   florida.txt

Los archivos californiaX.txt deben renombrarse cX.txt, X es un número.

Esto es lo que probé:

ls | sed 's/california/c/' 

Pero esto no puede almacenar los resultados. Leyendo algunas otras publicaciones, intenté agregar sh pero dice "comando no encontrado".

ls | sed 's/california/c/' | sh

El comando rename tampoco funciona (estoy en Mac). El comando mv funciona solo para un archivo. Así que probé un bucle que, igual, no funciona:

for file in california*; do  mv file c*; done

Cualquier información sobre lo que estoy haciendo mal sería bienvenida.

1
Natha 29 dic. 2016 a las 23:20

3 respuestas

La mejor respuesta

Una variable, cuando se refiere, se debe llevar con un $ (cuando se declara, no lo es). Y, debe hacer la sustitución de parámetros en la variable "archivo":

for file in california*; do mv "$file" "${file/california/c}"; done
2
Serhat Cevikel 29 dic. 2016 a las 21:02

Para cambiar el nombre de un archivo, necesita: 1. el nombre antiguo, 2. el nombre nuevo.

Sus intentos obtienen el nombre antiguo o el nombre nuevo. Ninguno intenta encontrar ambos al mismo tiempo.

Aquí están sus intentos juntos en una solución de trabajo:

for file in california*
do
  newname=$(echo "$file" | sed 's/california/c/')
  mv "$file" "$newname"
done

Esto puede escribirse más canónicamente en línea con la expansión de parámetros:

for file in california*
do
  mv "$file" "c${file#california}"
done
1
that other guy 29 dic. 2016 a las 20:31

Utilice mv con bash substring-extracción como

for file in california*.txt
do
    mv -v -- "$file" "${file:0:1}${file:10:1}.${file#*.}"
done

Aquí, -- es un bash incorporado para indicar el final de las opciones de comando, después de lo cual solo se aceptan parámetros posicionales y no más indicadores de comando. Y la parte de extracción de subcadena es

$ {string: position} y $ {string: position: length}

"string" especifica nuestro nombre de variable y la "posición" es nuestro punto de partida para extraer información. Podemos ajustar esto aún más usando el parámetro "length". Cuando se usa la longitud con la posición, esto significa mostrar información que comienza en la posición x para una longitud de y.

1
Inian 29 dic. 2016 a las 21:52