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.


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'

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 *)


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'


-1

Una forma de hacerlo es:

ls -1  | sed "s/\(.*\)\..*$/mv '&' '\1.txt'/" | sh

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'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.