Question

Dans un répertoire, j'ai un tas de fichiers *. html . J'aimerais les renommer tous en *. Txt

Comment puis-je faire cela? J'utilise le shell bash.

Était-ce utile?

La solution

Pour une meilleure solution (avec uniquement la fonctionnalité 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 renommer (bien que vous l'ayez le plus souvent 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 contenant des espaces sans citation correcte (maintenant ajouté ci-dessus). Lorsque vous travaillez uniquement sur vos propres fichiers et que vous savez qu'il n'y a pas d'espaces dans les noms de fichiers, cela fonctionnera, mais chaque fois que vous écrivez quelque chose qui peut être réutilisé ultérieurement, ne sautez pas les guillemets appropriés.

Autres conseils

Si vous utilisez bash, vous n'avez pas besoin de commandes externes telles que sed, nom_base, renommer, expr, etc.

for file in *.html
do
  mv "$file" "${file%.html}.txt"
done
rename 's/\.html$/\.txt/' *.html

fait exactement ce que vous voulez.

Cela a fonctionné pour moi sur OSX de .txt à .txt_bak

find . -name '*.txt' -exec sh -c 'mv "<*>" "${0%.txt}.txt_bak"' {} \;

Vous souhaitez utiliser renommer :

rename -S .html .txt *.html

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

Remarque: Greg Hewgill souligne correctement que ce n'est pas une bash intégrée. et est une commande Linux séparée. Si vous avez juste besoin de quelque chose sur Linux, cela devrait fonctionner correctement; si vous avez besoin de quelque chose de plus multi-plateforme, jetez un coup d'œil à l'une des autres réponses.

Sur un Mac ...

  1. Installez renommer si vous ne l'avez pas encore: changement d'installation de brassage
  2. renommer -S .html .txt * .html

Pour les utilisateurs Ubuntu:

rename 's/\.html$/\.txt/' *.html

Voici un exemple de commande de changement de nom:

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

Le -n signifie que c'est un test et ne changera aucun fichier. Il vous montrera une liste de fichiers qui seraient renommés si vous supprimiez le -n. Dans le cas ci-dessus, tous les fichiers du répertoire en cours seront convertis à partir d'une extension de fichier de .htm en .html.

Si le résultat du test ci-dessus semble correct, vous pouvez exécuter la version finale:

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

Le -v est facultatif, mais il est judicieux de l'inclure car il s'agit du seul enregistrement des modifications apportées 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, soulignée ci-dessous:

<*>

Après l'exploration du site Web de quelqu'un d'autre, des milliers de fichiers ne possédant pas l'extension .html manquaient au travers d'une vaste arborescence de sous-répertoires.

Pour les renommer tous en une fois, à l'exception des fichiers ayant déjà une extension .html (la plupart n'en avaient aucune), 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 du PO, je pourrais le modifier légèrement pour ne renommer que les fichiers * .txt, comme suit:

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

Décompressé (hammertime!):

-iname * .txt
  - Signifie que SEUL les fichiers se terminant déjà par .txt

mv -iv "{}. {txt, html} "   - Lorsque find passe un {} en tant que nom de fichier, $ {filename%. *} Extrait son nom de base sans extension pour définir les paramètres sur mv . bash demande au {txt, html} de le réécrire sous forme de deux paramètres afin que la dernière commande s'exécute comme suit: mv -iv " nomfichier.txt " "filename.html"

Correction nécessaire: gestion des espaces dans les noms de fichiers

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

zmv '(*).*' '$1.txt'

Si vous obtenez zsh: commande non trouvée: zmv , lancez simplement:

autoload -U zmv

Et puis réessayez.

Merci à cet article original pour le conseil à propos de zmv.

C’est la solution la plus simple que je trouve qui fonctionne sous OSX et Linux, et elle fonctionne également avec git!

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

et avec git:

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

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

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

le ; correspondra au chemin, le * correspondra au nom de fichier, et on les appellera # 1 et . # 2 dans le nom de remplacement.

Les réponses basées sur exec ou les pipes étaient soit trop lents, soit ils échouaient sur un très grand nombre de fichiers.

Essayez ceci

rename .html .txt *.html 

utilisation:

rename [find] [replace_with] [criteria]

Un peu tard pour la fête. Vous pouvez le faire avec xargs:

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

Ou si tous vos fichiers sont dans un dossier

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

Si vous préférez PERL, il existe 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

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

=)

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

Malheureusement, il n'est pas facile de faire de manière portable. Vous avez probablement besoin d’un peu de magie d’expr.

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

Supprimez l'écho une fois que vous êtes satisfait, il fait ce que vous voulez.

Modifier: le nom de base est probablement un peu plus lisible dans ce cas particulier, bien que expr soit plus flexible en général.

C’est un bon moyen de modifier plusieurs extensions à la fois:

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

Remarque: veillez à ce que la taille de l'extension soit identique (le ???)

Nice & amp; simple!

find . -iname *.html  -exec mv {} "$(basename {} .html).text"  \;

Voici ce que j'ai l'habitude de renommer les fichiers .edge en .blade.php

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

Fonctionne comme un charme.

Une ligne, pas de boucles: ls -1 | xargs -L 1 -I {} bash -c 'mv $ 1 "$ {1%. *}. txt"' _ {}

cbongiorno@ip-172-31-26-242:~/pgsql$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.json  ac8453e2-0d82-4d43-b80e-205edb754700.json
cbongiorno@ip-172-31-26-242:~/pgsql$ ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
cbongiorno@ip-172-31-26-242:~/pgsql$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.txt  ac8453e2-0d82-4d43-b80e-205edb754700.txt
cbongiorno@ip-172-31-26-242:~/pgsql$ 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top