web-dev-qa-db-fra.com

Changer récursivement les extensions de fichiers dans Bash

Je veux parcourir récursivement un répertoire et changer l'extension de tous les fichiers d'une certaine extension, par exemple .t1 à .t2. Quelle est la commande bash pour faire cela?

65
Amal Antony

Si vous avez renommé, utilisez:

find . -name "*.t1" -exec rename 's/\.t1$/.t2/' '{}' \;

Si renommer n'est pas disponible, utilisez:

find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' \;
153
anubhava

Si votre version de bash prend en charge l'option globstar (version 4 ou ultérieure):

shopt -s globstar
for f in **/*.t1; do
    mv "$f" "${f%.t1}.t2"
done 
8
chepner

Ou vous pouvez simplement installer la commande mmv et faire:

mmv '*.t1' '#1.t2'

Ici #1 est la première partie glob, c’est-à-dire le * dans *.t1.

Ou bien, dans le pur style bash, un moyen simple serait:

for f in *.t1; do
    mv "$f" "${i%.t1}.t2"
done

(i.e .: for peut lister des fichiers sans l'aide d'une commande externe telle que ls ou find)

HTH

6
zmo

Je referais ce chemin en bash:

for i in $(ls *.t1); 
do
    mv "$i" "${i%.t1}.t2" 
done

EDIT: mon erreur: ce n'est pas récursif, voici ma façon de changer récursivement le nom de fichier:

for i in $(find `pwd` -name "*.t1"); 
do 
    mv "$i" "${i%.t1}.t2"
done
2
jrjc