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.
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.
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
rename 's/\.html$/\.txt/' *.html
fait exactement ce que vous voulez.
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.
cela a fonctionné pour moi sur OSX de .txt pour .txt_bak
find . -name '*.txt' -exec sh -c 'mv ""151900920"" "${0%.txt}.txt_bak"' {} \;
Pour Les Utilisateurs Ubuntu:
rename 's/\.html$/\.txt/' *.html
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
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
Essayez cette
rename .html .txt *.html
utilisation:
rename [find] [replace_with] [criteria]
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' - {}
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.
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.
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)
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' - '{}' \;
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.
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.
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 ???)