Bash'de dosya uzantılarını özyinelemeli olarak değiştirin


87

Ben bir dizin üzerinden iterate recursively ve belli bir uzantısının tüm dosyaların uzantısı değiştirmek istiyorum, demek .t1için .t2. Bunu yapmak için bash komutu nedir?


14
imho bu yinelenen bir soru değil - diğer soru yinelemeli değil
shonky linux kullanıcısı


@AmalAntony: Eğer yoksa rename, tek bir dosyayı yeniden adlandıran (basit durumunuzda yapılması önemsiz) bir kabuk komut dosyası yazın ve ardından findbu komut dosyasını rahatsız edici uzantıya sahip tüm dosyalara uygulamak için kullanın .
user1934428

Yanıtlar:


208

Yeniden adlandırmanız varsa, şunu kullanın:

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

veya başka:

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

Yeniden adlandırma mevcut değilse şunu kullanın:

find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' +

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

2
(Benim renamesürümüm sed stili ikame ifadesine izin vermiyor. Linux'u sevmeliyim. Bunun gibi şeyler yapabilmek için Windows için TotalCommander'ı yüklemem gerekiyordu.)
Aaron Blenkush

6
"${1%.t1}".t2Benim yaptığım gibi, herhangi birinin parçanın ne yaptığını merak etmesi durumunda : Aşağıdakileri yapmak için bash dizesi manipülasyonunu kullanır: 1 / İlk konumsal parametreyi alın $1ve .t1dizeyi sonundan itibaren kesin (yüzde işareti %operatörü). 2 / .t2Dize değişmez değerini sonuca ekleyin .
Zack

2
Yeniden adlandırma OSX'te benim için işe yaramadı, ancak bash sürümü harika b / c
mv'nin

3
kullanıcıyı find . -type f -name '*.t1'klasörlerden kaçınması için tercih et
Golak Sarangi

9

Sürümünüz seçeneği bashdestekliyorsa globstar(sürüm 4 veya üzeri):

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

7

Veya basitçe mmvkomutu kurabilir ve şunları yapabilirsiniz :

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

İşte #1ilk glob kısmı, yani *in *.t1.

Ya da saf bash şeylerinde basit bir yol şöyle olabilir:

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

(yani: veya forgibi harici bir komutun yardımı olmadan dosyaları listeleyebilirlsfind )

HTH


7
OP'nin "özyinelemeli" kullanımının, dizinin alt dizinlerinde bulunan dosyaları yeniden adlandırmak anlamına geldiğini varsayıyorum.
chepner

1
bu ilk glob parçası, yani *in*.t1
zmo

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.