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.

Gilles 'SO- arrête d'être méchant'
la source
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'
Gilles 'SO- arrête d'être méchant'
la source
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 *)

Patrick
la source
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»

Utilisateur inconnu
la source
-1

Une façon de le faire est:

ls -1  | sed "s/\(.*\)\..*$/mv '&' '\1.txt'/" | sh
mazianni
la source
2
Ne pas analyser la sortie dels . Et générer un script shell est un moyen sûr de se tirer une balle dans la tête. La question de Vault Boy contient une approche raisonnable du côté de la coque, manquant juste la bonne incantation sed et quelques citations.
Gilles 'SO- arrête d'être méchant'