Copia / rinomina più file usando l'espressione regolare (shell script)


8

Ho una raccolta di file che corrispondono a un modello come "assegnazione02.cc", "assegnazione02.h", "assegnazione02.txt", ecc. Vorrei copiare / rinominare questi file in "assegnazione03.cc", "assegnazione03. h ',' assegnment03.txt 'e così via.

Ho il sospetto che questo dovrebbe essere semplice usando uno script di shell e sed. Finora ho:

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

Sfortunatamente il modo in cui sto invocando sed restituisce sempre la stringa di input $namee in realtà non trova / sostituisce regex.

Nota: guardando su Internet c'è un renamecomando che ha questa funzionalità, ma che non è disponibile sul mio MacBook.


Cambia le virgolette singole in virgolette doppie. Se hai virgolette singole attorno al comando sed, allora $OLD_NOe $NEW_NOnon si espanderà.
Mikel,

newname=$(echo $name | tr $OLD_NO $NEW_NO)
Nizam Mohamed,

Risposte:


5

L'uso di sed qui introduce più complessità di quanto valga la pena. Utilizzare le funzionalità di manipolazione del testo integrate nella shell. Ad esempio, ${name#assignment02}rimuove il prefisso assignment02da $name.

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

Le doppie virgolette non sono necessarie se si è certi che i nomi dei file non contengano caratteri speciali della shell.

Se hai zsh disponibile, la sua zmvfunzione è utile per questo tipo di rinominazioni.

autoload zmv
zmv '(assignment)02.(*)' '${1}03.$2'

3

Stai già pensando troppo complesso

rename 02 03 *02*

'rename' sostituisce il primo arg ('02') con il secondo arg ('03') nel nome di tutti i file dati su arg3 o dopo (* 02 *)


Il renamecomando con questa sintassi è un'utilità Linux, non disponibile su OSX (e nemmeno disponibile con questo nome sulla maggior parte delle installazioni di Debian e Ubuntu).
Gilles 'SO- smetti di essere malvagio' l'

Ah, non sapevo che fossi su osx, peccato
Patrick,

Rinomina è uno script perl, quindi probabilmente verrà eseguito su OS X. L'ho trovato qui utilizzando google: tips.webdesign10.com/files/rename.pl.txt
azzid

0

Un approccio diverso:

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

A lungo termine: prova a "rinominare"


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.