Je voudrais changer une extension de fichier de *.txt
à *.text
. J'ai essayé d'utiliser la commande basename
, mais j'ai du mal à 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
Directement de Wiki de Greg :
# Renommez tous * .txt en * .text Pour f dans * .txt; faire mv - "$ f" "$ {f% .txt} .text" fait
Voir également l'entrée expliquant pourquoi vous ne devez pas analyser ls
.
Edit: si vous devez utiliser basename
, votre syntaxe serait:
pour f dans * .txt; faire mv - "$ f" "$ (nom de base -" $ f ".txt) .text" fait
Voici comment je change toutes les extensions de fichiers dans le répertoire courant sur Debian.
rename "s/oldExtension/newExtension/" *.txt
(Il s'agit de la commande Perl rename
, pas de util-linux
une. Voir Pourquoi l'utilitaire de changement de nom sur Debian/Ubuntu est-il différent de celui sur d'autres distributions, comme CentOS? )
Une simple commande, la rename
de util-linux
, fera cela pour vous, il remplacera chaque occurrence de "txt" par "text" dans tous les fichiers correspondant à "* .txt":
rename txt text *.txt
rename "s/oldExtension/newExtension/" *.txt
Ci-dessus fonctionne bien mais limité au répertoire actuel. Essayez la commande ci-dessous, qui est flexible avec des sous-répertoires. Il renommera tout .txt
fichiers sous la structure du répertoire avec une nouvelle extension.
find . -name "*.txt" -exec rename 's/.txt$/.newext/' {} \;
Les réponses référençant ici s/oldExtension/newExtension/
sont faux. Si tu utilises s/txt/text/
, vous convertiriez footxt.txt
à footext.txt
, ce qui n'est pas ce que vous voulez. Même si vous utilisez s/.txt/.text/
, cela convertirait footxt.txt
à fo.text.txt
.
Vous devez utiliser \.
pour correspondre à la période (.
correspondra à n'importe quel caractère). Et la fin $
pour correspondre à la fin de la ligne. Seulement cela correspondra correctement à l'extension.
rename 's/\.txt$/.text/' *.txt
rename 's/\.old$/.new/' *.old
for f in *.txt
do
[ -f "$f" ] && mv "$f" "${f%txt}text"
done
Basé sur la réponse @Prince John Wesley, voici un script bash simple pour changer toutes les extensions de fichiers dans le répertoire courant de ext1
à ext2
. Affiche également les noms des fichiers à renommer.
#!/bin/bash
for f in *.$1
do
[ -f "$f" ] && mv -v "$f" "${f%$1}$2"
done
Exemple d'utilisation (en supposant que le nom du script est change-ext
):
change-ext ext1 ext2
Raison n ° 53 pour passer à zsh:
zmv '(*).txt' '$1.text'
disons que vos fichiers sont dispersés dans divers répertoires, en supposant que dirx est votre répertoire parent, cela peut faire le travail en utilisant find:
for f in `find /dirx -iname '*.txt' -type f -print`;do mv "$f" ${f%.txt}.text; done
C'est ce qui fonctionne pour moi:
find . -name '*.txt' -exec rename 's/\.txt$/.text/' \{} \;
Quand vous
n'ont pas d'extension pour les fichiers source
et l'extension cible est . text vous le feriez de cette façon -
for f in *; do mv -- "$f" "${f%.\*}.text"; done
Si vous voulez savoir ce qui ne va pas dans votre version: vous avez utilisé $files
au lieu de $x
dans la commande basename. Cela devrait donc fonctionner (non testé, cependant):
for x in *.txt
do
mv "$x" "`basename '$x' .txt`.text"
done