web-dev-qa-db-fra.com

Renommer un groupe de fichiers avec une seule commande

Si j'ai un groupe de fichiers avec une extension .htm, comment puis-je les renommer tous en .html?

mv *.htm *.html

ne marche pas.

38
Richard Hoskins

Ou, vous pouvez utiliser pure bash ... (sauf pour mv, c'est-à-dire ..)

for file in *.htm; do mv "$file" "${file%.htm}.html"; done

et évitez les trucs méchants de base. ;)

Bash dispose d'un vaste ensemble d'options d'extension variables. Celui utilisé ici, '%', supprime le plus petit suffixe correspondant de la valeur de la variable. Le modèle est un modèle global, donc ${file%.*} fonctionnerait également. L'opérateur '%%' supprime le suffixe de correspondance le plus grand et est interchangeable dans l'exemple ci-dessus. Comme le modèle est fixe, ${file%%.*}.html transforme cependant a.b.htm en a.html.

Reportez-vous à la section relative à la substitution variable de la page de manuel bash pour obtenir des astuces plus judicieuses. Il y a beaucoup de choses qui peuvent être faites directement au sein de bash.

50
falstro

rename(1) est un utilitaire Perl qui fait exactement ce que vous voulez. Dans ce cas:

rename 's/\.htm$/.html/' *htm

ou si vous utilisez des sous-répertoires aussi

(nécessite Bash 4.0 et le paramètre globstar: shopt -s globstar)

rename 's/\.htm$/.html/' **/*htm

11
TRS-80

Il ne devrait pas y avoir d'espaces, de nouvelles lignes ou d'autres espaces dans les noms de fichiers, mais cette version de la réponse de freiheit les gère. Il utilise également $() au lieu de backticks pour la lisibilité ainsi que d'autres avantages.

for file in *.htm
do
    mv "$file" "$(basename "$file" .htm).html"
done

Encore mieux - pour le cas particulier de simplement ajouter à la fin:

for file in *.htm
do
    mv "$file" "${file}l"
done
11
Dennis Williamson
for file in *.htm; do
  mv $file `basename "$file" .htm`.html
done

Essayez-le avec un echo devant le mv pour la première fois.

Le problème avec votre original est que "mv *.htm *.html" a le *s géré par le shell. Par conséquent, la commande mv voit simplement une liste de tous les fichiers .htm et .html du répertoire en cours. En d'autres termes, quelque chose comme "mv foo.htm bar.htm stuff.htm six.htm file.htm". mv ne sait gérer plus de 2 arguments que si le dernier est un répertoire.

6
freiheit

Encore un autre exemple pur bash utilisant string replace.

for file in *.htm; do mv $file ${file/htm/html}; done

Extra - remplace toutes les occurrences d'une chaîne

for file in *.htm; do mv $file ${file//htm/html}; done
3
xalupadas

Si vous utilisez Zsh vous pouvez utiliser 'zmv'

1
Martin

Le meilleur outil est mmv .

mmv \*.htm #1.html

Autres exemples d'utilisation (et d'autres outils) dans " Résumé des outils de ligne de commande GNU/Linux ".

1
bortzmeyer

Le paquetage util-linux-ng (sur Fedora) a une commande rename similaire à celle mentionnée par TRS-8 . Vous pouvez l'utiliser comme ceci:

rename .htm .html *.html
0
Cristian Ciupitu