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?
(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
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
Réponses:
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' - '{}' +
la source
find . -name '*.t1' -exec rename .t1 .t2 {} +
rename
n'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.)"${1%.t1}".t2
piè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$1
et tronquez la.t1
chaîne littérale à sa fin (%
opérateur de signe de pourcentage ). 2 / Ajoutez la.t2
chaîne littérale au résultat.find . -type f -name '*.t1'
pour éviter les dossiersSi votre version de
bash
prend en charge l'globstar
option (version 4 ou ultérieure):shopt -s globstar for f in **/*.t1; do mv "$f" "${f%.t1}.t2" done
la source
Ou vous pouvez simplement installer la
mmv
commande et faire:mmv '*.t1' '#1.t2'
Voici
#1
la 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:
for
peut lister des fichiers sans l'aide d'une commande externe telle quels
oufind
)HTH
la source
*
in*.t1
$ mmv -n ';*.t1' '#1#2.t2'
. supprimer le-n
drapeau pour exécuterJe 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
la source
find
syntaxe est mauvaise. Assurez-vous également de citer vos variables