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
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/' *
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
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.
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.
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