web-dev-qa-db-fra.com

Comment changer l'extension de plusieurs fichiers?

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
192
afbr1201

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 
211
jasonwryan

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? )

157
Matthias Braun

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
43
lamwaiman1988
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/' {} \;
31
Rahul

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
12
wisbucky
for f in *.txt
do
    [ -f "$f" ] && mv "$f" "${f%txt}text"
done
9
Prince John Wesley

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
8
Dennis Golomazov

Raison n ° 53 pour passer à zsh:

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

7
Burrito

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
6
Arash

C'est ce qui fonctionne pour moi:

find . -name '*.txt' -exec rename 's/\.txt$/.text/' \{} \;
2
yegor256

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
2
nitinr708

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
1
daniel kullmann