Comment puis-je renommer l'extension pour un tas de fichiers?
Dans un répertoire, j'ai un tas de *.html
fichiers. Je voudrais renommer tous à *.txt
Comment puis-je le faire? J'utilise le shell bash.
Vous devez vous connecter pour publier un commentaire.
Pour une meilleure solution (avec seulement les fonctionnalités de bash, par opposition à des appels externes), voir l'une des autres réponses.
Suivantes pourraient faire et ne nécessite pas le système pour que la
rename
programme (bien que le plus souvent ce sur un système):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.
ren *.a *.b
$()
au lieu de legs backtick de la syntaxe. Améliore la lisibilité et rend la syntaxe beaucoup moins ambigu lorsque vous avez des caractères qui aurait besoin d'être anti-slash-échappé littéralement à l'intérieur de la substitution de commande avec ce dernier.fait exactement ce que vous voulez.
rename 's/jpg/png/' *.jpg
, c'est plus facile à retenir et à taper. Il peut provoquer une erreur si il y a un nom de fichier contient jpg, donc je vais vérifier d'abord avant de taper.Cela a fonctionné pour moi sur OSX de .txt pour .txt_bak
.txt
à.txt_bak
vous suffit de concaténer_bak
😉.scss
à.sass
(après conversion en place...):find . -name '*.scss' -exec sh -c 'mv "$0" "${0%.scss}.sass"' {} \;
Vous souhaitez utiliser
renommer
:C'est exactement ce que vous voulez - il va changer l'extension de
.html
à.txt
pour tous les fichiers correspondant à*.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.
rename
programme n'est pas liée àbash
et n'est également pas disponible sur toutes les plateformes. Je n'ai vu que sur Linux.rename -S .html .text *.html
où-S
signifie--subst-all
Sur un Mac...
brew install rename
rename -S .html .txt *.html
Pour Les Utilisateurs D'Ubuntu :
Voici un exemple de la commande renommer:
L'-n signifie que c'est un test et ne sera pas modifier les fichiers. Il va vous montrer une liste de fichiers qui serait renommé, si vous avez supprimé l'-n. Dans le cas ci-dessus, il vous permet de convertir tous les fichiers dans le répertoire courant à partir d'un fichier extension .htm pour .html.
Si le résultat de l'essai regardé ok puis vous pouvez exécuter la version finale:
L'-v est optionnel, mais c'est une bonne idée de l'inclure, car il est le seul album que vous aurez des modifications qui ont été apportées par la commande renommer comme illustré dans l'exemple de sortie ci-dessous:
La partie la plus délicate dans le milieu est une substitution Perl avec des expressions régulières, a mis en évidence ci-dessous:
Après quelqu'un d'autre du site d'analyse, je me suis retrouvé avec des milliers de fichiers manquants à l' .l'extension html, dans un vaste arborescence de sous-répertoires.
Pour renommer tous d'un seul coup, à l'exception des fichiers ayant déjà un .l'extension html (la plupart d'entre eux n'en avaient pas du tout), cela a fonctionné pour moi:
Dans le cas des OP cas je peut modifier que légèrement, à seulement renommer *.les fichiers txt, comme suit:
Ventilés (hammertime!):
-iname *.txt
- Les moyens considérer UNIQUEMENT les fichiers déjà se terminant en .txt
mv -iv "{}.{txt,html}"
- Quand trouver passe un {} pour le nom de fichier, ${filename%.*} il tire son nom de base sans aucune extension pour former les paramètres de mv. bash prend le {txt,html} pour réécrire sous la forme de deux paramètres de la finale de la commande s'exécute en tant que:
mv -iv "filename.txt" "filename.html"
Correctif nécessaire si: gérer les espaces dans les noms de fichiers
Cette question mentionne explicitement Bash, mais si vous arrive d'avoir ZSH disponibles, il est assez simple:
Si vous obtenez
zsh: command not found: zmv
puis exécutez simplement:Et puis essayez à nouveau.
Grâce à cette article original pour l'astuce sur zmv.
C'est la meilleurs solution que j'ai trouvé qui fonctionne sur OSX et Linux, et il fonctionne très bien avec git trop!
find . -name "*.js" -exec bash -c 'mv "$1" "${1%.js}".tsx' - '{}' \;
et avec git:
find . -name "*.js" -exec bash -c 'git mv "$1" "${1%.js}".tsx' - '{}' \;
La la commande
mmv
semble faire cette tâche de manière très efficace sur un grand nombre de fichiers (des dizaines de milliers de personnes dans une seconde). Par exemple, pour renommer tous les.xml
fichiers.html
fichiers, utilisez ceci:la
;
va correspondre au chemin d'accès, le*
devra correspondre au nom du fichier, et ceux-ci sont appelés#1
et#2
dans le remplacement du nom.Des réponses basées sur
exec
ou les tuyaux étaient soit trop lent, soit échoué sur un très grand nombre de fichiers.Essayer cette
utilisation:
Un peu en retard à la fête. Vous pourriez le faire avec xargs:
Ou si tous les fichiers sont dans un dossier
ls
. Cette commande est ridicule: il inutilement utilise une boule avecls
, au lieu d'utiliser directement le glob. Cela permettra de rompre avec les noms de fichiers contenant des espaces, des citations et (en raison de l'absence de guillemets) glob caractères.Si vous préférez PERL, il y a un court script PERL (originairement écrit par Larry Wall, le créateur de PERL) qui permettra de faire 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 la mise à jour de l'URL)
C'est un bon moyen de modifier plusieurs extensions à la fois:
Remarque: faire attention à l'extension de la taille à être le même (le ???)
Malheureusement il n'est pas trivial à faire de façon portable. Vous avez probablement besoin d'un peu de expr magie.
Suppression de l'écho une fois que vous êtes heureux, il fait ce que vous voulez.
Edit:
basename
est sans doute un peu plus lisible pour ce cas particulier, bien queexpr
est plus souple en général.Nice & simple!
Voici ce que j'ai utilisé pour renommer
.edge
fichiers.blade.php
Fonctionne comme un charme.
Une seule ligne, pas de boucles:
ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}