Changer l'extension en plusieurs files

Je voudrais changer l'extension de file du file * .txt au file * .text, essayé en utilisant la command basename , mais j'ai du mal à changer plus d'un file, basename: too many arguments Try basename --help' for more information un nom de basename: too many arguments Try basename --help' for more information erreur.

Toute suggestion?

Voici mon code:

 files=`ls -1 *.txt` for x in $files do mv $x "`basename $files .txt`.text" done 

Directement du Wiki de Greg :

 # Rename all *.txt to *.text for f in *.txt; do mv -- "$f" "${f%.txt}.text" done 

Voir aussi l'input sur pourquoi vous ne devriez pas parsingr ls .

Edit: si vous devez utiliser basename votre syntaxe serait la suivante:

 for f in *.txt; do mv "$f" "$(basename "$f" .txt).text" done 

Voici comment je change toutes les extensions de files dans le directory courant de Debian.

 rename "s/oldExtension/newExtension/" *.txt 

Une simple command le fera pour vous, elle replacea toutes les occurrences de "txt" par "text" dans tous les files assortis "* .txt":

 rename txt text *.txt 
 rename "s/oldExtension/newExtension/" *.txt 

Au dessus fonctionne bien mais limité au directory actuel. Essayez la command ci-dessous, qui est flexible avec les sous-directorys. Il renommera tous les files .txt sous la structure de directory avec une nouvelle extension.

 find . -name "*.txt" -exec rename 's/.txt$/.newext/' {} \; 
 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 files dans le directory courant de ext1 à ext2 . Également les noms des files renommés.

 #!/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 

C'est ce qui fonctionne pour moi:

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

Les réponses ici référençant s/oldExtension/newExtension/ sont fausses. Si vous utilisez s/txt/text/ , vous devez convertir footxt.txt en footext.txt , ce qui n'est pas ce que vous voulez. Même si vous utilisez s/.txt/.text/ , cela convertirait footxt.txt en fo.text.txt .

Vous devez utiliser \. pour correspondre à la période ( . correspondra à n'importe quel caractère). Et le $ fuite pour correspondre à la fin de la ligne. Seul cela correspondra correctement à l'extension.

 rename 's/\.txt$/.text/' *.txt rename 's/\.old$/.new/' *.old 

disons que vos files sont dispersés dans divers directorys, en supposant que dirx est votre directory 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 

Si vous voulez savoir ce qui ne va pas dans votre version: Vous avez utilisé $files au lieu de $x dans la command basename. Donc, cela devrait fonctionner (non testé, cependant):

 for x in *.txt do mv "$x" "`basename '$x' .txt`.text" done