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?


14
à mon humble avis ce n'est pas une question en double - l'autre question n'est pas récursive
utilisateur de shonky linux

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' - '{}' +

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 

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


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.