Copier / renommer plusieurs fichiers à l'aide d'une expression régulière (script shell)


8

J'ai une collection de fichiers correspondant à un modèle tel que 'affectation02.cc', 'affectation02.h', 'affectation02.txt', etc. Je voudrais copier / renommer ces fichiers dans 'affectation03.cc', 'affectation03. h ',' assignation03.txt ', etc.

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 chaîne d'entrée $nameet ne fait pas réellement la recherche / remplacement d'expression régulière.

Remarque: En regardant sur Internet, il y a une renamecommande qui a cette fonctionnalité, mais qui n'est pas disponible sur mon MacBook.


Remplacez les guillemets simples par des guillemets doubles. Si vous avez des guillemets simples autour de la commande sed, alors $OLD_NOet $NEW_NOne sera pas développé.
Mikel

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

Réponses:


5

L'utilisation de sed ici introduit plus de complexité qu'elle n'en vaut la peine. Utilisez les fonctionnalités intégrées de manipulation de texte du shell. Par exemple, ${name#assignment02}supprime le préfixe assignment02de $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 fichier ne contiennent aucun caractère spécial shell.

Si zsh est disponible, sa zmvfonction est utile pour ce type de changement de nom.

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

3

Vous pensez déjà trop complexe

rename 02 03 *02*

'rename' remplace le premier arg ('02') par le second arg ('03') dans le nom de tous les fichiers donnés sur arg3 ou après (* 02 *)


La renamecommande avec cette syntaxe est un utilitaire Linux, non disponible sur OSX (et même pas disponible sous ce nom sur la plupart des installations Debian et Ubuntu).
Gilles 'SO- arrête d'être méchant'

Ah, je ne savais pas que tu étais sur osx, bummer
Patrick

Rename est un script perl, il s'exécutera donc probablement sur OS X. Vous l' avez
azzid

0

Une approche différente:

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

À long terme: essayez d'obtenir «renommer»


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.