menambahkan teks ke nama file sebelum ekstensi

25

Saya ingin menambahkan teks ke akhir nama file tetapi sebelum ekstensi. Saat ini saya sedang mencoba,

for f in *.shp; do echo $f_poly; done

outputnya adalah,

Quercus_acutifolia.shp_poly
Quercus_agrifolia.shp_poly
Quercus_corrugata.shp_poly
Quercus_cortesii.shp_poly
Quercus_costaricensis.shp_poly
Quercus_havardii.shp_poly
Quercus_hemisphaerica.shp_poly
Quercus_kelloggii.shp_poly
Quercus_knoblochii.shp_poly
Quercus_laceyi.shp_poly

Aku menginginkannya,

Quercus_acutifolia_poly.shp
Quercus_agrifolia_poly.shp
Quercus_corrugata_poly.shp
Quercus_cortesii_poly.shp
Quercus_costaricensis_poly.shp
Quercus_havardii_poly.shp
Quercus_hemisphaerica_poly.shp
Quercus_kelloggii_poly.shp
Quercus_knoblochii_poly.shp
Quercus_laceyi_poly.shp
Sam007
sumber

Jawaban:

27

Menggunakan ekspansi parameter POSIX standar :

for f in *.shp; do printf '%s\n' "${f%.shp}_poly.shp"; done
jw013
sumber
Luar biasa itulah yang saya butuhkan.
Sam007
1
Mungkin lebih baik dengan penjelasan cara kerjanya. Di sisi lain, jawaban Doug cukup mudah.
Sarge Borsch
@SargeBorsch Apa yang perlu Anda jelaskan? Jawaban saya, cuplikan dalam pertanyaan, dan jawaban Doug hanya berbeda dengan beberapa karakter, dan jawaban Doug menjelaskan lebih sedikit dari pada saya jadi saya tidak tahu apa yang Anda inginkan. Jika Anda hanya membandingkan perbedaan dalam dua keluaran dalam pertanyaan, itu seharusnya mudah untuk mencari tahu apa yang mereka lakukan. Saya bisa menjelaskan mengapa jawaban saya lebih disukai daripada jawaban Doug. 1. Saya menggunakan printfdengan format string bukan yang kurang portabel echo. 2. Saya menggunakan ekspansi parameter yang lebih efisien daripada memanggil binary eksternal ( basename) untuk tugas yang begitu sederhana.
jw013
Maka perintah untuk mengganti nama file akan menjadi ini:for f in *.shp; do mv $f ${f%.shp}_poly.shp; done
Patch92
6

Terkadang ada alat yang disebut "rename" diinstal.

rename 's/\.shp$/_poly.shp/' *shp

Mungkin tidak portabel tetapi mudah digunakan.

Chad Clark
sumber
1
Ini adalah satu-satunya yang bekerja untuk saya, jawaban yang bagus!
wanderer0810
4

Gunakan ini:

for file in *.shp; do echo $(basename $file .shp)_poly.shp; done
selesai24
sumber
3
Menggunakan basenamelebih lambat dan kurang efisien daripada membiarkan shell melakukan pekerjaannya sendiri. Ini mungkin terlihat untuk jumlah file yang sangat besar.
jw013
Juga, ada tanda kutip dan --s yang hilang dan gagal untuk nama file yang memiliki karakter baris baru sebelum .shp.
Stéphane Chazelas
Terima kasih telah memberikan jawaban yang sebenarnya dapat saya kerjakan untuk tujuan saya. Ini adalah bantuan, bukan kode golf. (membaca ini .. Saya menyadari itu mungkin terdengar seperti saya sedang sarkastik. Lebih mencekam tentang jawaban lain di sini daripada jawaban Anda. Terima kasih lagi)
Tim
3

Ini bekerja lebih baik untuk saya:

for f in *; do NEW=${f%.webm}_2016.webm; mv ${f} "${NEW}"; done

Vinnie James
sumber
Yah ini sangat mirip dengan jawaban yang diterima kecuali bahwa Anda mungkin ingin for f in *.webm, Anda lupa mengutip ${f}dan Anda kehilangan --.
Stéphane Chazelas
1
Jawaban yang diterima tidak bekerja pada OSX, hanya mencetak nama file baru, itu tidak benar-benar mengubah nama file
Vinnie James
1
Tentu saja, ini menunjukkan kepada Anda bagaimana menggunakan ekspansi shell untuk mendapatkan nama file baru, dalam menanggapi pertanyaan yang juga menghasilkan nama file (dengan echo), tetapi bukan yang diperlukan.
Stéphane Chazelas
1

Jika mereka berada di lokasi yang berbeda maka jalankan: -

for i in ` find /root/test/ -name "*.shp" ` ;
do
  mv $i ` echo $i | sed 's/.shp$/_poly.shp/g' ` ;
done
Shankey Ravi
sumber
1

Karena pertanyaannya adalah untuk bashtidak perlu utilitas eksternal, karena Anda dapat menggunakan bash regexps :

for i in *.shp
do
    mv -v "${i}" "${i%.*}_MYSUFFIX.${i##*.}"
done
ccpizza
sumber