Copier / renommer plusieurs files en utilisant une expression régulière (script shell)

J'ai une collection de files correspondant à un model comme 'assignment02.cc', 'assignment02.h', 'assignment02.txt', etc. Je voudrais copyr / renommer ces files dans 'assignment03.cc', 'assignment03. h ',' assignment03.txt ', et ainsi de suite.

Je soupçonne que cela devrait être simple en utilisant un script shell et sed. Jusqu'à présent, j'ai:

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 

Malheureusement, la façon dont j'invoque sed renvoie toujours la string d'input $name et ne fait pas la regex find / replace.

Note: Sur Internet, il y a une command rename qui a cette fonctionnalité, mais qui n'est pas disponible sur mon MacBook.

L'utilisation de sed ici introduit plus de complexité que cela en vaut la peine. Utilisez les fonctions de manipulation de text embeddedes au shell. Par exemple, ${name#assignment02} supprime le préfixe assignment02 de $name .

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

Les guillemets doubles ne sont pas nécessaires si vous êtes sûr que les noms de files ne contiennent aucun caractère spécial shell.

Si vous avez zsh disponible, sa fonction zmv est utile pour ces types de renommage.

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

Vous pensez déjà trop complexe

 rename 02 03 *02* 

'rename' remplace le premier argument ('02') par le deuxième argument ('03') dans le nom de tous les files donnés sur arg3 ou après (* 02 *)

Une approche différente:

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

À long terme: Essayez d'get "renommer"

Une façon de le faire est:

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