Je voudrais changer une extension de fichier de *.txt
à *.text
. J'ai essayé d'utiliser la basename
commande, mais je ne parviens pas à modifier plusieurs fichiers.
Voici mon code:
files=`ls -1 *.txt`
for x in $files
do
mv $x "`basename $files .txt`.text"
done
Je reçois cette erreur:
basename: too many arguments Try basename --help' for more information
bash
shell-script
rename
afbr1201
la source
la source
Réponses:
Tout droit du wiki de Greg :
Voir également l'entrée sur pourquoi vous ne devriez pas analyser
ls
.Edit: si vous devez utiliser
basename
votre syntaxe serait:la source
*.txt
syntaxe) , le double tiret nu--
et l'utilisation du symbole% dans la${}
construction . Jusqu'à présent, je n'avais jamais rencontré les deux derniers et je ne savais pas ce qui se passait réellement avec les premiers.for f in *.txt; do mv -- "$f" "${f%.txt}.text"; done
Voici comment je modifie toutes les extensions de fichiers du répertoire actuel de Debian.
(Il s'agit de la
rename
commande Perl , pas de celle-util-linux
ci. Voir Pourquoi l'utilitaire de changement de nom sur Debian / Ubuntu est-il différent de celui utilisé sur d'autres distributions, comme CentOS? )la source
brew install rename
et faire en sorte que cela fonctionne.rename "s/oldExtension/newExtension/" **.txt
pour renommer tous les fichiers * .txt de manière récursivefootxt.txt
. Utilisez plutôt ceci: unix.stackexchange.com/questions/19654/…rename 's/$/.txt/' *
Une commande simple, le à
rename
partirutil-linux
, le fera pour vous, il remplace toutes les occurences de « txt » à « texte » dans toute correspondance de fichier « * .txt »:la source
rename
change la première occurrence, afin de mieux faire querename .txt .text
, mais cela ne fonctionne toujours pas toujours (par exemple , il renommefoo.txtx.bar.txt
àfoo.textx.bar.txt
).rename
commande est en faitperl-rename
et utilise des expressions rationnelles perl. Pour cela, la commande équivalente serait:rename 's/.txt/.text/' *.txt
. Les gens devraient vérifierman rename
leur système pour savoir lequel ils ont.Ci-dessus fonctionne bien mais limité au répertoire en cours. Essayez la commande ci-dessous, qui est flexible avec les sous-répertoires. Il renommera tous les
.txt
fichiers sous la structure de répertoires avec une nouvelle extension.la source
rename
peut gérer plusieurs fichiers en argument, vous pouvez considérablement accélérer les choses en utilisant à la+
place de\;
s'il existe beaucoup de fichiers de ce typefootxt.txt
. Utilisez plutôt ceci: unix.stackexchange.com/questions/19654/…la source
Les réponses ici référencées
s/oldExtension/newExtension/
sont fausses. Si vous utilisezs/txt/text/
, vous convertiriezfootxt.txt
enfootext.txt
, ce qui n'est pas ce que vous voulez. Même si vous utilisezs/.txt/.text/
, cela se convertiraitfootxt.txt
enfo.text.txt
.Vous devez utiliser
\.
pour faire correspondre la période (.
correspond à n'importe quel caractère). Et la fuite$
pour correspondre à la fin de la ligne. Seulement cela correspondra correctement à l'extension.la source
Sur la base de la réponse Wesley @Prince John, voici un simple script bash pour changer toutes les extensions de fichiers dans le répertoire courant de
ext1
laext2
. Affiche également les noms des fichiers en cours de changement de nom.Exemple d'utilisation (en supposant que le nom du script soit
change-ext
):la source
for...
) par deux lignes:shopt -s globstar
etfor f in **/*.$1
. Nécessite Bash 4+.Raison n ° 53 pour passer à zsh:
zmv '(*).txt' '$1.text'
la source
Supposons que vos fichiers sont dispersés dans différents répertoires. En supposant que dirx soit votre répertoire parent, vous pouvez effectuer le travail à l'aide de find:
la source
C'est ce qui fonctionne pour moi:
la source
Lorsque vous
et l'extension cible est .text vous le feriez de cette façon -
la source
for f in *.html; do mv -- "$f" "${f%.\*}.pug"; done
Si vous voulez savoir ce qui ne va pas dans votre version: Vous avez utilisé à la
$files
place de$x
la commande basename. Donc, cela devrait fonctionner (non testé, cependant):la source