Copie / cambie el nombre de múltiples archivos usando expresiones regulares (script de shell)

8

Tengo una colección de archivos que coinciden con un patrón, como 'ejercicio02.cc', 'ejercicio02.h', 'ejercicio02.txt', etc. Me gustaría copiar / renombrar estos archivos en 'trabajo03.cc', 'trabajo03. h ',' task03.txt ', y así sucesivamente.

Sospecho que esto debería ser sencillo usando un script de shell y sed. Hasta ahora tengo:

OLD_NO=$1
NEW_NO=$2

echo "Moving from $OLD_NO to $NEW_NO"

for name in assignment$OLD_NO.* ; do
  newname=$(echo $name | sed 's/\(.*\)$OLD_NO\(.*\)/\1xx$NEW_NO\2/')
  echo "$name -> $newname"
  # mv -v $name $newname
done

Desafortunadamente, la forma en que estoy invocando sed siempre devuelve la cadena de entrada $namey en realidad no hace que la expresión regular busque / reemplace.

Nota: en Internet hay un renamecomando que tiene esta funcionalidad, pero que no está disponible en mi MacBook.

Gilles 'SO- deja de ser malvado'
fuente
Cambie las comillas simples a comillas dobles. Si tiene comillas simples alrededor del comando sed, entonces $OLD_NOy $NEW_NOno se amplió.
Mikel
newname=$(echo $name | tr $OLD_NO $NEW_NO)
Nizam Mohamed

Respuestas:

5

Usar sed aquí introduce más complejidad de lo que vale. Use las funciones de manipulación de texto incorporadas en el shell. Por ejemplo, ${name#assignment02}quita el prefijo assignment02de $name.

for name in assignment02.*; do
  mv "$name" "assignment03${name#assignment02}"
done

Las comillas dobles no son necesarias si está seguro de que los nombres de los archivos no contienen caracteres especiales de shell.

Si tiene disponible zsh, su zmvfunción es útil para este tipo de modificaciones.

autoload zmv
zmv '(assignment)02.(*)' '${1}03.$2'
Gilles 'SO- deja de ser malvado'
fuente
3

Ya estás pensando demasiado complejo

rename 02 03 *02*

'rename' reemplaza el primer arg ('02') con el segundo arg ('03') en el nombre de todos los archivos dados en arg3 o después (* 02 *)

Patricio
fuente
El renamecomando con esta sintaxis es una utilidad de Linux, no disponible en OSX (y ni siquiera disponible con este nombre en la mayoría de las instalaciones de Debian y Ubuntu).
Gilles 'SO- deja de ser malvado'
Ah, no sabía que estabas en OSX, fastidio
Patrick
Rename es un script perl, por lo que probablemente se ejecutará en OS X. Lo encontré aquí usando google: tips.webdesign10.com/files/rename.pl.txt
azzid
0

Un enfoque diferente:

for ext in {cc,h,txt}
do 
  echo mv assignment02.$ext assignment03.$ext
done

A la larga: intente obtener 'cambiar el nombre'

usuario desconocido
fuente
-1

Una forma de hacerlo es:

ls -1  | sed "s/\(.*\)\..*$/mv '&' '\1.txt'/" | sh
mazianni
fuente
2
No analice la salida dels . Y generar un script de shell es una forma segura de dispararte en la cabeza. La pregunta de Vault Boy contiene un enfoque razonable en el lado del caparazón, solo falta el encantamiento de sed correcto y algunas citas.
Gilles 'SO- deja de ser malvado'