Juste pour être complet, ren *.htm *.htmlfonctionnera sous Windows.
Brian Burns
Réponses:
50
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%%.*}.htmlabhtm 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.
Notez également que ces extensions de paramètres ne se limitent pas à bash . Ils sont disponibles sur tous les shells dérivés de Bourne ( sh , ksh , bash , zsh , dash , cendres , etc.). Les extensions font partie de la spécification POSIX pour le «langage de commande shell» et sont très portables.
Chris Johnsen
11
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:
renommer est plus facile, mais ce n’est pas un programme unix standard; La question originale ne précise pas quel unix. Semble être "prename" dans certains endroits.
Freiheit
2
renamevient avec perl, et fondamentalement chaque unix vient avec perl ces jours-ci.
TRS-80
3
oui, mais tous les unix ne comprennent pas des programmes auxiliaires tels que 'renommer' quand ils mettent perl sur le système. OSX, par exemple, n'a pas "renommer" dessus.
Freiheit
1
@William: la syntaxe double astérisque n'est disponible que dans Bash 4 et versions ultérieures et uniquement si elle est activée avec shopt -s globstar(désactivé par défaut). En outre, Linux et Unix ont des répertoires plutôt que des dossiers.
pause jusqu'à nouvel ordre.
6
for file in*.htm;do
mv $file `basename "$file" .htm`.html
done
Essayez-le avec un echodevant la mvpremière fois.
Le problème avec votre original est que " mv *.htm *.html" le *s est géré par le shell. La mvcommande 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.
Vous devriez citer "$ file", pour gérer les espaces.
Richard Hoskins
Votre description du problème initial devrait être soulignée plus fortement. Ce comportement d’extension de shell pour les caractères génériques est surprenant et n’intéresse pas les utilisateurs de Windows, mais comprendre son fonctionnement montre clairement pourquoi l’application originale mvne fonctionnera pas.
Greg Hewgill le
3
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
ren *.htm *.html
fonctionnera sous Windows.Réponses:
Ou, vous pouvez utiliser pure bash ... (sauf pour mv, c'est-à-dire ..)
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.
la source
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.Encore mieux - pour le cas particulier de simplement ajouter à la fin:
la source
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
la source
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.Essayez-le avec un
echo
devant lamv
première fois.Le problème avec votre original est que "
mv *.htm *.html
" le*
s est géré par le shell. Lamv
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.la source
mv
ne fonctionnera pas.Encore un autre exemple pur bash utilisant string replace.
Extra - remplace toutes les occurrences d'une chaîne
la source
Si vous utilisez Zsh, vous pouvez utiliser 'zmv'
la source
Le meilleur outil est mmv .
Autres exemples d'utilisation (et d'autres outils) dans " Résumé des outils de ligne de commande GNU / Linux ".
la source
#
.Le paquet util-linux-ng (sur Fedora) a une
rename
commande similaire à celle mentionnée par TRS-80 . Vous pouvez l'utiliser comme ceci:la source