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?

Amal Antony
sumber
14
imho ini bukan pertanyaan duplikat - pertanyaan lain tidak rekursif
shonky pengguna linux
Terkait: askubuntu.com/questions/35922/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@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' - '{}' +
anubhava.dll
sumber
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 
chepner
sumber
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

zmo
sumber
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
jrjc
sumber
8
Jangan parse ls , dan lihat halaman yang sama untuk mengetahui mengapa findsintaks Anda buruk. Juga, pastikan Anda mengutip variabel Anda
Reinstate Monica Please