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.
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.
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
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
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.
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
Si vous utilisez Zsh vous pouvez utiliser 'zmv'
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 ".
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