Dans un répertoire, j'ai un tas de *.html
fichiers. Je voudrais tous les renommer*.txt
Comment puis je faire ça? J'utilise le shell bash.
la source
Dans un répertoire, j'ai un tas de *.html
fichiers. Je voudrais tous les renommer*.txt
Comment puis je faire ça? J'utilise le shell bash.
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.
la source
"${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.fait exactement ce que vous voulez.
la source
Cela a fonctionné pour moi sur OSX de .txt à .txt_bak
la source
.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
: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.
la source
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
Sur un Mac ...
brew install rename
rename -S .html .txt *.html
la source
Pour les utilisateurs d'Ubuntu:
la source
C'est la solution la plus simple que j'ai trouvée qui fonctionne sur OSX et Linux, et elle fonctionne aussi très bien avec git!
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 source
Voici un exemple de la commande renommer:
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:
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:
La partie délicate au milieu est une substitution Perl avec des expressions régulières, mise en évidence ci-dessous:
la source
Cette question mentionne explicitement Bash, mais s'il vous arrive d'avoir ZSH disponible, c'est assez simple:
Si vous obtenez,
zsh: command not found: zmv
lancez simplement:Et puis réessayez.
Merci à cet article original pour l'astuce sur zmv.
la source
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:
Dans le cas de l'OP, je pourrais modifier légèrement cela, pour ne renommer que les fichiers * .txt, comme ceci:
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 source
La commande
mmv
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: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.la source
Essaye ça
usage:
la source
Un peu tard pour la fête. Vous pouvez le faire avec xargs:
Ou si tous vos fichiers sont dans un dossier
la source
ls
. Cette commande est ridicule: elle utilise inutilement un glob avecls
, 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:
Remarque: faites attention à ce que la taille de l'extension soit la même (la ???)
la source
Nice & simple!
la source
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:
la source
De la même manière que ce qui a été suggéré auparavant, voici comment je l'ai fait:
J'ai d'abord validé avec
la source
Une ligne, pas de boucles:
Exemple:
la source
Malheureusement, ce n'est pas trivial de le faire de manière portable. Vous avez probablement besoin d'un peu de magie expr.
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'ilexpr
soit plus flexible en général.la source
Voici ce que j'ai utilisé pour renommer des
.edge
fichiers.blade.php
Fonctionne comme un charme.
la source
Vous pouvez également créer une fonction dans Bash, l'ajouter
.bashrc
ou quelque chose, puis l'utiliser où vous le souhaitez.Usage:
Source de code en fonction: https://stackoverflow.com/a/1224786/6732111
la source
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:Exécutez-le
./rename.sh .old .new
.Par exemple.
./rename.sh .html .txt
la source