Ubah ekstensi file secara berulang di Bash


87

Saya ingin rekursif iterate melalui direktori dan mengubah ekstensi dari semua file dari ekstensi tertentu, mengatakan .t1untuk .t2. Apa perintah bash untuk melakukan ini?


14
imho ini bukan pertanyaan duplikat - pertanyaan lain tidak rekursif
shonky pengguna linux


@AmalAntony: Jika Anda tidak punya rename, tulis skrip shell, yang mengganti nama satu file (sepele untuk dilakukan dalam kasus sederhana Anda), lalu gunakan finduntuk menerapkan skrip ini ke semua file dengan ekstensi yang melanggar.
pengguna1934428

Jawaban:


208

Jika Anda telah mengganti nama tersedia kemudian gunakan:

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

atau:

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

Jika ganti nama tidak tersedia, gunakan:

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

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

2
(Versi saya renametidak mengizinkan ekspresi penggantian gaya sed. Harus menyukai Linux. Dulu saya harus menginstal TotalCommander untuk Windows untuk melakukan hal-hal seperti ini.)
Aaron Blenkush

6
Jika ada yang bertanya-tanya apa "${1%.t1}".t2bagian itu, seperti yang saya lakukan: Ini menggunakan manipulasi string bash untuk melakukan hal berikut: 1 / Ambil parameter posisi pertama $1dan potong .t1literal string dari ujungnya ( %operator tanda persentase ). 2 / Tambahkan .t2string literal ke hasil.
Zack

2
Ganti nama tidak berhasil untuk saya di OSX, tetapi versi bashnya luar biasa b / c Saya baru saja menambahkan 'git' di depan mv dan sekarang git senang :-D
bdombro

3
lebih memilih pengguna find . -type f -name '*.t1'untuk menghindari map
Golak Sarangi

9

Jika versi Anda bashmendukung globstaropsi (versi 4 atau lebih baru):

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

7

Atau Anda cukup menginstal mmvperintah dan melakukan:

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

Ini #1adalah bagian bola pertama yaitu *dalam *.t1.

Atau dalam hal pesta murni, cara sederhana adalah:

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

(yaitu: fordapat membuat daftar file tanpa bantuan perintah eksternal seperti lsatau find)

HTH


7
Saya berasumsi penggunaan OP "rekursif" mengacu pada mengganti nama file di subdirektori direktori juga.
chepner

1
Ini adalah bagian bola pertama yaitu *dalam*.t1
bola zmo

6

Saya akan melakukan cara ini dalam pesta:

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

EDIT: kesalahan saya: ini tidak rekursif, inilah cara saya untuk mengubah nama file secara rekursif:

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

8
Jangan parse ls , dan lihat halaman yang sama untuk mengetahui mengapa findsintaks Anda buruk. Juga, pastikan Anda mengutip variabel Anda
Reinstate Monica Please
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.