Réponses:
Pour une meilleure solution (avec uniquement la fonctionnalité bash, par opposition aux appels externes), consultez l' une des autres réponses .
Ce qui suit ferait et n'exige pas que le système ait le rename
programme (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 avec des espaces sans citations appropriées (maintenant ajoutés ci-dessus). Lorsque vous travaillez uniquement sur vos propres fichiers dont vous savez qu'ils n'ont pas d'espace 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 citations appropriées.
ren *.a *.b
$()
syntaxe backtick héritée spécifiée par POSIX . Améliore la lisibilité et rend la syntaxe beaucoup moins ambiguë lorsque vous avez des caractères qui devraient être échappés par une barre oblique inverse pour être littéraux dans la substitution de commande avec cette dernière.
Si vous utilisez bash, vous n'avez pas besoin de commandes externes comme sed, nom de base, renommer, expr, etc.
for file in *.html
do
mv "$file" "${file%.html}.txt"
done
"${file%.*}.txt"
, mais cela pourrait être dangereux pour les fichiers sans extension.
$
à l'intérieur des accolades!
--
"l'opérateur": mv - "$ file" "$ {file% .html} .txt" Cet opérateur empêche les noms de fichiers commençant par un '-' d'être analysé par mv comme arguments.
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" "${0%.txt}.txt_bak"' {} \;
.txt
chez .txt_bak
vous il suffit de concaténer _bak
;)
.scss
en .sass
(après la conversion sur place…):find . -name '*.scss' -exec sh -c 'mv "$0" "${0%.scss}.sass"' {} \;
Vous souhaitez utiliser rename
:
rename -S .html .txt *.html
Cela fait exactement ce que vous voulez - cela changera l'extension de .html
à .txt
pour tous les fichiers correspondants *.html
.
Remarque: Greg Hewgill souligne correctement qu'il ne s'agit pas d'une fonction 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 multiplateforme, jetez un œil à l'une des autres réponses.
rename
programme n'est pas lié à bash
et n'est pas non plus disponible sur toutes les plateformes. Je ne l'ai vu que sous Linux.
rename -S .html .text *.html
où -S
est synonyme de--subst-all
Pour les utilisateurs d'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 test et ne modifiera en fait aucun fichier. Il vous montrera une liste de fichiers qui seraient renommés si vous supprimiez le -n. Dans le cas ci-dessus, il convertira tous les fichiers du répertoire actuel à partir d'une extension de fichier de .htm en .html.
Si la sortie du test ci-dessus semblait correcte, vous pouvez exécuter la version finale:
rename -v ’s/\.htm$/\.html/’ *.htm
Le -v est facultatif, mais c'est une bonne idée de l'inclure car c'est le seul enregistrement que vous aurez des modifications qui ont été apportées par la commande renommer 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, mise en évidence ci-dessous:
rename -v ’s/\.htm$/\.html/’ *.htm
Cette question mentionne explicitement Bash, mais s'il vous arrive d'avoir ZSH disponible, c'est assez simple:
zmv '(*).*' '$1.txt'
Si vous obtenez, zsh: command not found: zmv
lancez simplement:
autoload -U zmv
Et puis réessayez.
Merci à cet article original pour l'astuce sur zmv.
Après l'exploration du site Web de quelqu'un d'autre, je me suis retrouvé avec des milliers de fichiers sans l'extension .html, dans une large arborescence de sous-répertoires.
Pour les renommer tous d'un seul coup, à l'exception des fichiers ayant déjà une 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 modifier légèrement cela, pour ne renommer que les fichiers * .txt, comme ceci:
find . -xtype f -iname *.txt -exec filename="{}" mv -iv ${filename%.*}.{txt,html} \;
En panne (hammertime!):
-iname * .txt
- Signifie que seuls les fichiers se terminant déjà par .txt
mv -iv "{}. {txt, html}" - Lorsque find passe un {} comme nom de fichier, $ {filename%. *} 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 afin que la commande finale s'exécute comme:mv -iv "filename.txt" "filename.html"
Correction nécessaire cependant: gérer les espaces dans les noms de fichiers
La commandemmv
semble effectuer cette tâche très efficacement sur un grand nombre de fichiers (des dizaines de milliers en une seconde). Par exemple, pour renommer tous les .xml
fichiers en .html
fichiers, utilisez ceci:
mmv ";*.xml" "#1#2.html"
le ;
correspondra au chemin, le *
correspondra au nom de fichier, et ceux-ci sont appelés #1
et#2
dans le nom de remplacement.
Les réponses basées sur exec
ou les canaux étaient trop lentes ou ont échoué sur un très grand nombre de fichiers.
Essaye ça
rename .html .txt *.html
usage:
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' - {}
ls
. Cette commande est ridicule: elle utilise inutilement un glob avec ls
, au lieu d'utiliser directement le glob. Cela rompra avec les noms de fichiers contenant des espaces, des guillemets et (en raison du manque de guillemets) des caractères globaux.
C'est un bon moyen de modifier plusieurs extensions à la fois:
for fname in *.{mp4,avi}
do
mv -v "$fname" "${fname%.???}.mkv"
done
Remarque: faites attention à ce que la taille de l'extension soit la même (la ???)
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:
rename.pl 's/html/txt/' *.html
De la même manière que ce qui a été suggéré auparavant, voici comment je l'ai fait:
find . -name '*OldText*' -exec sh -c 'mv "$0" "${0/OldText/NewText}"' {} \;
J'ai d'abord validé avec
find . -name '*OldText*' -exec sh -c 'echo mv "$0" "${0/OldText/NewText}"' {} \;
Une ligne, pas de boucles:
ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
Exemple:
$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.json ac8453e2-0d82-4d43-b80e-205edb754700.json
$ ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.txt ac8453e2-0d82-4d43-b80e-205edb754700.txt
Malheureusement, ce n'est pas trivial de le faire de manière portable. Vous avez probablement besoin d'un peu de magie 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.
Edit: basename
est probablement un peu plus lisible pour ce cas particulier, bien qu'il expr
soit plus flexible en général.
Voici ce que j'ai utilisé pour renommer des .edge
fichiers.blade.php
for file in *.edge; do mv "$file" "$(basename "$file" .edge).blade.php"; done
Fonctionne comme un charme.
Vous pouvez également créer une fonction dans Bash, l'ajouter .bashrc
ou quelque chose, puis l'utiliser où vous le souhaitez.
change-ext() {
for file in *.$1; do mv "$file" "$(basename "$file" .$1).$2"; done
}
Usage:
change-ext css scss
Source de code en fonction: https://stackoverflow.com/a/1224786/6732111
Renommez les extensions de fichier pour tous les fichiers du répertoire et des sous-répertoires actuels sans aucun autre package (utilisez uniquement le script shell):
Créez un script shell rename.sh
sous le répertoire courant avec le code suivant:
#!/bin/bash
for file in $(find . -name "*$1"); do
mv "$file" "${file%$1}$2"
done
Exécutez-le ./rename.sh .old .new
.
Par exemple. ./rename.sh .html .txt