557 votes

Comment puis-je renommer l'extension d'un lot de fichiers?

Dans un répertoire, j'ai un tas d' *.html fichiers.

Je voudrais renommer toutes à l' *.txt

J'utilise le shell bash.

771voto

ghostdog74 Points 86060

si vous utilisez bash, pas besoin pour les commandes externes comme sed, basename, renommer, expr...etc

for files in *.html
do
 mv "$files" "${files%.html}.txt"
done

417voto

Mikael Auno Points 2699

Les éléments suivants devraient faire et ne nécessite pas le système pour avoir l' rename program (bien que le plus souvent ce sur un système):

for file in *.html; do
    mv "$file" "`basename $file .html`.txt"
done

EDIT: Comme l'a souligné dans les commentaires, cela ne fonctionne pas pour les noms de fichiers avec des espaces dedans sans la citation (maintenant ajouté ci-dessus). Lorsque l'on travaille uniquement sur vos propres fichiers que vous savez ne pas avoir des espaces dans les noms de fichiers cela fonctionne mais à chaque fois que vous écrivez quelque chose qui peut être réutilisé ultérieurement, ne sautez pas bon de le citer.

Pour une meilleure solution (avec seulement les fonctionnalités de bash, par opposition à des appels externes), voir l'une des autres réponses.

206voto

Amber Points 159296
rename 's/\.html$/\.txt/' *.html

fait exactement ce que vous voulez.

102voto

Dave Rigby Points 5375

Vous souhaitez utiliser rename :

rename .html .txt *.html

C'est exactement ce que vous voulez - il va changer l'extension d' .html de .txt pour tous les fichiers correspondant à l' *.html.

Remarque: Greg Hewgill souligne à juste titre ce n'est pas un bash builtin, et est séparée de commande Linux. Si vous avez juste besoin quelque chose sur Linux, cela devrait fonctionner correctement; si vous avez besoin de quelque chose de plus de la croix-plate-forme, puis jetez un oeil à l'un des autres réponses.

1voto

Charles Bailey Points 244082

Malheureusement, il n'est pas trivial à faire de façon portable. Vous avez probablement besoin d'un peu de expr magie.

for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done

Suppression de l'écho une fois que vous êtes heureux, il fait ce que vous voulez.

Edit: basename est probablement un peu plus lisible pour ce cas particulier, bien que l' expr est plus souple en général.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X