web-dev-qa-db-fra.com

Comment renommer plusieurs fichiers en remplaçant Word dans le nom de fichier?

Remplacez ACDC par AC-DC

Par exemple, nous avons ces fichiers

ACDC - Rock N 'Roll n'est pas une pollution sonore.xxx

ACDC - Rocker.xxx

ACDC - Shoot To Thrill.xxx

Je veux qu'ils deviennent:

AC-DC - Rock N 'Roll n'est pas une pollution sonore.xxx

AC-DC - Rocker.xxx

AC-DC - Shoot To Thrill.xxx

Je sais que sed ou awk est utilisé pour cette opération. Je ne peux rien sur Google, donc je vous demande votre aide =) Pourriez-vous s'il vous plaît fournir une commande Shell fonctionnelle complète pour cette tâche?

Commentaires: Solution pour les utilisateurs OSX

37
holms
rename 's/ACDC/AC-DC/' *.xxx

de man rename

DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified as the 
first argument.  The perlexpr argument is a Perl expression which is expected to modify the 
$_ string in Perl for at least some of the filenames specified.  If a given filename is not 
modified by the expression, it will not be renamed.  If no filenames are given on
           the command line, filenames will be read via standard input.

Par exemple, pour renommer tous les fichiers correspondant à "* .bak" pour supprimer l'extension, vous pourriez dire

rename 's/\.bak$//' *.bak

Pour traduire les noms en majuscules en caractères inférieurs, vous utiliseriez

rename 'y/A-Z/a-z/' *
46
Joel K

Cette réponse contient les bonnes parties de toutes les autres réponses, tout en omettant une hérésie telle que ls | while read.

Répertoire actuel:

for file in ACDC*.xxx; do
    mv "$file" "${file//ACDC/AC-DC}"
done

Y compris les sous-répertoires:

find . -type f -name "ACDC*" -print0 | while read -r -d '' file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

Les caractères de nouvelle ligne sont vraiment peu susceptibles d'être dans les noms de fichiers, donc cela peut être plus simple tout en travaillant avec des noms contenant des espaces:

find . -type f -name "ACDC*" | while read -r file; do
    mv "$file" "${file//ACDC/AC-DC}"
done
13
user1686

Pour utiliser la version util-linux de rename à laquelle Phil a fait référence (sur Ubuntu, cela s'appelle rename.ul):

rename ACDC AC-DC ACDC*

ou

rename.ul ACDC AC-DC ACDC*

Utilisation du shell bash

find . -type f -name "ACDC*" -print0 | while read -d $'\0' f
do
   new=`echo "$f" | sed -e "s/ACDC/AC-DC/"`
   mv "$f" "$new"
done

Remarque: l'utilisation de find traitera le répertoire courant et les répertoires sous.

4
Ring Ø

Cela dépend de votre coque. En zsh, je ferais ceci:

for file in ACDC*.xxx; do
    mv "$file" "$(echo $file | sed -e 's/ACDC/AC-DC/')"
done

Probablement pas la meilleure solution, mais ça marche.

1
polemon

Utilisation de bash:

ls *.xxx | while read fn; do
    mv "${fn}" "${fn/ACDC/AC-DC}";
done

Si le programme rename est installé:

rename 's/ACDC/AC-DC/' *.xxx
1
ThatGraemeGuy