Saya ingin rekursif iterate melalui direktori dan mengubah ekstensi dari semua file dari ekstensi tertentu, mengatakan .t1untuk .t2. Apa perintah bash untuk melakukan ini?
@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:
(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
rename
, tulis skrip shell, yang mengganti nama satu file (sepele untuk dilakukan dalam kasus sederhana Anda), lalu gunakanfind
untuk menerapkan skrip ini ke semua file dengan ekstensi yang melanggar.Jawaban:
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' - '{}' +
sumber
find . -name '*.t1' -exec rename .t1 .t2 {} +
rename
tidak mengizinkan ekspresi penggantian gaya sed. Harus menyukai Linux. Dulu saya harus menginstal TotalCommander untuk Windows untuk melakukan hal-hal seperti ini.)"${1%.t1}".t2
bagian itu, seperti yang saya lakukan: Ini menggunakan manipulasi string bash untuk melakukan hal berikut: 1 / Ambil parameter posisi pertama$1
dan potong.t1
literal string dari ujungnya (%
operator tanda persentase ). 2 / Tambahkan.t2
string literal ke hasil.find . -type f -name '*.t1'
untuk menghindari mapJika versi Anda
bash
mendukungglobstar
opsi (versi 4 atau lebih baru):shopt -s globstar for f in **/*.t1; do mv "$f" "${f%.t1}.t2" done
sumber
Atau Anda cukup menginstal
mmv
perintah dan melakukan:mmv '*.t1' '#1.t2'
Ini
#1
adalah 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:
for
dapat membuat daftar file tanpa bantuan perintah eksternal sepertils
ataufind
)HTH
sumber
*
dalam*.t1
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
sumber
find
sintaks Anda buruk. Juga, pastikan Anda mengutip variabel Anda