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.
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.
Réponses:
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 motif est un motif glob, donc ${file%.*}
fonctionnerait aussi. L'opérateur '%%' supprime le suffixe de correspondance le plus grand, et est interchangeable dans l'exemple ci-dessus, car le motif est fixé, ${file%%.*}.html
abhtm deviendrait cependant un fichier 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.
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é avec 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
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 réglage de globstar: shopt -s globstar
)
rename 's/\.htm$/.html/' **/*htm
rename
vient avec perl, et fondamentalement chaque unix vient avec perl ces jours-ci.
shopt -s globstar
(désactivé par défaut). En outre, Linux et Unix ont des répertoires plutôt que des dossiers.
for file in *.htm; do
mv $file `basename "$file" .htm`.html
done
Essayez-le avec un echo
devant la mv
première fois.
Le problème avec votre original est que " mv *.htm *.html
" le *
s est géré par le shell. La mv
commande voit donc 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.
mv
ne fonctionnera pas.
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 paquet util-linux-ng (sur Fedora) a une rename
commande similaire à celle mentionnée par TRS-80 . Vous pouvez l'utiliser comme ceci:
rename .htm .html *.html
ren *.htm *.html
fonctionnera sous Windows.