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

36

Remplacer ACDC en AC-DC

Par exemple, nous avons ces fichiers

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

ACDC - Rocker.xxx

ACDC - Tirez sur 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 - Tirez sur Thrill.xxx

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

Commentaires: solution pour les utilisateurs OSX

holms
la source
1
Je sens qu’il ya une question plus large ici - essayez-vous de corriger les noms de fichiers mp3 en général? Un certain nombre de scripts ont été écrits au fil des ans pour y parvenir. Je pense que celui que j'ai utilisé s'appelle mp3fixer.
Phil Hollenback
non ce n'est pas à propos de mp3, je dois juste gérer quelques gros fichiers avec des noms similaires, et quelque chose que tout doit être remplacé ou corrigé ... situation courante, donc j'ai besoin de cette astucieuse solution pour les renommer tous
holms

Réponses:

45
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" afin de supprimer l’extension, vous pouvez dire:

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

Pour traduire les noms en majuscules, vous utiliseriez

rename 'y/A-Z/a-z/' *
Joel K
la source
5
Notez que beaucoup de machines linux sont renommées depuis util-linux, qui implémente une substitution simple, pas de regex. Donc, si le changement de nom échoue silencieusement sans rien faire, vous utilisez probablement le mauvais rename.
Phil Hollenback
Je cherchais cela depuis des lustres! thnx!
Holms
@PhilHollenback Comment trouver / installer le bon alors? :)
henry
Cela ne fonctionne pas quand j'ai des traits de soulignement dans mes noms de fichiers au lieu d'espaces - comment puis-je résoudre ce problème?
unfa
13

Cette réponse contient les bonnes parties de toutes les autres réponses, tout en laissant de côté 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

Il est très peu probable que les caractères de nouvelle ligne se trouvent dans les noms de fichiers. Cela peut donc être plus simple tout en utilisant des noms contenant des espaces:

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

Pour utiliser la version util-linux de renamece Phil (sur Ubuntu, cela s'appelle rename.ul):

rename ACDC AC-DC ACDC*

ou

rename.ul ACDC AC-DC ACDC*
En pause jusqu'à nouvel ordre.
la source
1
votre variante est la meilleure =) tant d’articles stupides dans google sur la recherche, l’envoi et la révolte ... à cette opération simple pour laquelle renameutils egxist existe déjà!
Holms
4

Utiliser le 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: using findtraitera le répertoire actuel et les répertoires sous.

Ø de bague
la source
1

Cela dépend de votre coquille. 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 fonctionne.

polemon
la source
1

En utilisant bash:

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

Si vous avez le renameprogramme installé:

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