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

dans un répertoire, j'ai un tas de fichiers *.html .

j'aimerais les renommer tous en *.txt

j'utilise le shell bash.

389
demandé sur codeforester 2009-08-04 01:42:10

18 réponses

pour une meilleure solution (avec seulement des fonctionnalités bash, par opposition aux appels externes), voir une des autres réponses .


ce qui suit ferait et n'exigerait pas que le système ait le programme rename (bien que vous auriez le plus souvent cela sur un système):

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

EDIT: comme indiqué dans les commentaires, cela ne fonctionne pas pour les noms de fichiers avec les espaces sans citation (maintenant ajouté ci-dessus). Lorsque vous travaillez purement sur vos propres fichiers que vous savez ne pas avoir d'Espaces Dans les noms de fichiers cela fonctionnera, mais chaque fois que vous écrivez quelque chose qui peut être réutilisé à un moment ultérieur, ne sautez pas les citations appropriées.

302
répondu Mikael Auno 2017-09-14 11:59:00

si vous utilisez bash, vous n'avez pas besoin de commandes externes comme sed, basename, rename, expr, etc.

for file in *.html
do
  mv "$file" "${file%.html}.txt"
done
563
répondu ghostdog74 2018-03-11 10:40:54
rename 's/\.html$/\.txt/' *.html

fait exactement ce que vous voulez.

168
répondu Amber 2009-08-03 21:45:35

vous souhaitez utiliser rename :

rename -S .html .txt *.html

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

Note: Greg Hewgill souligne à juste titre qu'il ne s'agit pas d'un bash builtin; et qu'il s'agit d'une commande Linux séparée. Si vous avez juste besoin de quelque chose sur Linux cela devrait fonctionner très bien; si vous avez besoin de quelque chose de plus multiplate-forme alors jetez un oeil à l'une des autres réponses.

81
répondu DaveR 2015-10-10 16:16:15

cela a fonctionné pour moi sur OSX de .txt pour .txt_bak

find . -name '*.txt' -exec sh -c 'mv ""151900920"" "${0%.txt}.txt_bak"' {} \;
77
répondu Steven Lizarazo 2014-12-04 03:12:20

sur un Mac...

  1. Installer renommer si vous n'avez pas: brew install rename
  2. rename -S .html .txt *.html
29
répondu izilotti 2015-07-22 22:28:02

Pour Les Utilisateurs Ubuntu:

rename 's/\.html$/\.txt/' *.html
14
répondu Bheru Lal Lohar 2015-02-27 08:00:40

Voici un exemple de la commande renommer:

rename -n ’s/\.htm$/\.html/’ *.htm

le-n signifie qu'il s'agit d'un essai et qu'il ne changera pas de fichiers. Il vous montrera une liste de fichiers qui seraient renommés si vous supprimiez l'option-n. Dans le cas ci-dessus, il convertira tous les fichiers dans le répertoire courant à partir d'une extension de fichier de .htm pour .HTML.

si la sortie de l'essai ci-dessus semblait ok, alors vous pourriez exécuter la version finale:

rename -v ’s/\.htm$/\.html/’ *.htm

le-v est optionnel, mais c'est une bonne idée de l'inclure car c'est le seul enregistrement que vous aurez des modifications qui ont été faites par la commande rename comme indiqué dans l'exemple de sortie ci-dessous:

$ rename -v 's/\.htm$/\.html/' *.htm
3.htm renamed as 3.html
4.htm renamed as 4.html
5.htm renamed as 5.html

la partie délicate au milieu est une substitution Perl avec des expressions régulières, en surbrillance ci-dessous:

rename -v ’s/\.htm$/\.html/’ *.htm
7
répondu A.A 2014-09-28 05:19:46

après avoir rampé sur le site de quelqu'un d'autre, j'ai fini avec des milliers de fichiers qui manquaient le .extension html, à travers un large arbre de sous-répertoires.

pour les renommer tous en un coup, sauf les fichiers ayant déjà un .extension html( la plupart d'entre eux n'en avaient pas du tout), cela a fonctionné pour moi:

cd wwwroot
find . -xtype f \! -iname *.html   -exec mv -iv "{}"  "{}.html"  \;  # batch rename files to append .html suffix IF MISSING

dans le cas de L'OP je pourrais le modifier légèrement, pour ne renommer que *.fichiers txt, comme ceci:

find . -xtype f  -iname *.txt   -exec filename="{}"  mv -iv ${filename%.*}.{txt,html}  \; 

ventilé (hammertime!):

- iname *.txt

- Signifie considérer seulement les fichiers qui se terminent déjà .txt

mv-iv" {}.{txt, html}" - Lorsque trouve passe un {} comme nom du fichier, $ {Nom du fichier%.* } extrait son nom de base sans aucune extension pour former les paramètres à mv . bash prend le {TXT, html} pour le réécrire en deux paramètres de sorte que la commande finale s'exécute comme suit:: mv -iv "filename.txt" "filename.html"

correction nécessaire cependant: traiter les espaces dans les noms de fichiers

5
répondu Marcos 2014-07-03 12:03:54

Essayez cette

rename .html .txt *.html 

utilisation:

rename [find] [replace_with] [criteria]
3
répondu P Sreedhar 2014-02-06 11:55:03

Un peu en retard à la fête. Vous pouvez le faire avec xargs:

ls *.html | xargs -I {} sh -c 'mv  `basename  .html`.txt' - {}

ou si tous vos fichiers sont dans un dossier quelconque

ls folder/*.html | xargs -I {} sh -c 'mv  folder/`basename  .html`.txt' - {}
3
répondu esp 2015-06-17 10:09:07

cette question mentionne explicitement Bash, mais si vous avez ZSH disponible, c'est assez simple:

zmv '(*).*' '.txt'

Si vous obtenez zsh: command not found: zmv , puis exécutez simplement:

autoload -U zmv

et réessayez.

merci à cet article original pour le Conseil sur zmv.

3
répondu Michael Leonard 2017-06-20 02:45:07

la commande mmv semble effectuer cette tâche très efficacement sur un grand nombre de fichiers (des dizaines de milliers à la seconde). Par exemple, pour renommer tous les fichiers .xml en fichiers .html , utilisez ceci:

mmv ";*.xml" "#1#2.html"

le ; correspond au chemin, le * correspond au nom du fichier, et ceux-ci sont appelés #1 et #2 dans le nom de remplacement.

réponses basé sur exec ou pipes étaient soit trop lent ou a échoué sur un très grand nombre de dossiers.

3
répondu Roko Mijic 2017-11-03 14:00:21

si vous préférez PERL, il y a un court script PERL (écrit à l'origine par Larry Wall, le créateur de PERL) qui fera exactement ce que vous voulez ici: tips.webdesign10.com/files/rename.pl.txt . Pour votre exemple, ce qui suit devrait faire l'affaire

rename.pl 's/html/txt/' *.html

=)

(Merci @loretoparisi pour L'URL mise à jour)

2
répondu dudusan 2016-06-18 16:48:35

C'est la solution la plus élégante que J'ai trouvée qui fonctionne sur OSX et Linux, et elle fonctionne bien avec git aussi!

find . -name "*.js" -exec bash -c 'mv "" "${1%.js}".tsx' - '{}' \;

et avec git:

find . -name "*.js" -exec bash -c 'git mv "" "${1%.js}".tsx' - '{}' \;

1
répondu bdombro 2018-09-21 13:46:42

malheureusement, ce n'est pas anodin à faire. Tu as probablement besoin d'un peu de magie expr.

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

enlevez l'écho une fois que vous êtes heureux qu'il fait ce que vous voulez.

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

0
répondu CB Bailey 2009-08-03 22:07:11

voici ce que j'ai utilisé pour renommer .edge files en .blade.php

for file in *.edge; do     mv "$file" "$(basename "$file" .edge).blade.php"; done

ça marche comme du charme.

0
répondu Nixon Kosgei 2018-02-07 08:23:26

c'est une bonne façon de modifier plusieurs extensions à la fois:

for fname in *.{mp4,avi}
do
   mv -v "$fname" "${fname%.???}.mkv"
done

Note: soyez prudent à la taille de l'extension d'être le même (le ???)

0
répondu Nick De Greek 2018-09-22 20:38:29