Modifier récursivement les extensions de fichiers dans Bash

87

Je veux itérer récursive dans un répertoire et modifiez l'extension de tous les fichiers d'une certaine extension, dire .t1à .t2. Quelle est la commande bash pour faire cela?

Amal Antony
la source
14
à mon humble avis ce n'est pas une question en double - l'autre question n'est pas récursive
utilisateur de shonky linux
En relation: askubuntu.com/questions/35922/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

207

Si vous avez renommé disponible, utilisez:

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

ou sinon:

find . -name '*.t1' -exec rename .t1 .t2 {} +

Si le changement de nom n'est pas disponible, utilisez:

find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' +
anubhava
la source
20
find . -name '*.t1' -exec rename .t1 .t2 {} +
Aaron Blenkush
2
(Ma version de renamen'autorise pas l'expression de substitution de style sed. Je dois adorer Linux. J'avais l'habitude d'installer TotalCommander pour Windows pour faire des choses comme ça.)
Aaron Blenkush
6
Au cas où quelqu'un se demanderait ce que fait la "${1%.t1}".t2pièce, comme je l'ai fait: Il utilise la manipulation de chaîne bash pour faire ce qui suit: 1 / Prenez le premier paramètre de position $1et tronquez la .t1chaîne littérale à sa fin ( %opérateur de signe de pourcentage ). 2 / Ajoutez la .t2chaîne littérale au résultat.
Zack
2
Le changement de nom n'a pas fonctionné pour moi dans OSX, mais la version bash est géniale b / c je viens d'ajouter 'git' devant mv et maintenant git est heureux :-D
bdombro
3
préférez l'utilisateur find . -type f -name '*.t1'pour éviter les dossiers
Golak Sarangi
8

Si votre version de bashprend en charge l' globstaroption (version 4 ou ultérieure):

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

Ou vous pouvez simplement installer la mmvcommande et faire:

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

Voici #1la première partie du glob c'est à dire le *in *.t1.

Ou dans des trucs de pure bash, un moyen simple serait:

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

(ie: forpeut lister des fichiers sans l'aide d'une commande externe telle que lsou find)

HTH

zmo
la source
7
Je suppose que l'utilisation de "récursivement" par l'OP se réfère également au changement de nom des fichiers dans les sous-répertoires du répertoire.
chepner
Désolé, mais quelle est la signification de # 1?
inafalcao
1
c'est la première partie du glob ie le *in*.t1
zmo
récursive: $ mmv -n ';*.t1' '#1#2.t2'. supprimer le -ndrapeau pour exécuter
okliv
5

Je ferais de cette façon 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 de nom de fichier récursif:

for i in $(find `pwd` -name "*.t1"); 
do 
    mv "$i" "${i%.t1}.t2"
done
jrjc
la source
8
N'analysez pas les ls et consultez la même page pour savoir pourquoi votre findsyntaxe est mauvaise. Assurez-vous également de citer vos variables
Réintégrer Monica s'il vous plaît
2
Merci, je ne savais pas.
jrjc