Saya memiliki skrip bash yang saya coba untuk mengganti titik-titik dalam nama file dan menggantinya dengan garis bawah, membiarkan ekstensi tetap utuh (saya berada di Centos 6 btw). Seperti yang Anda lihat dari output di bawah ini, skrip berfungsi ketika ada titik untuk diganti, tetapi dalam kasus di mana satu-satunya titik adalah ekstensi, skrip tetap mencoba untuk mengubah nama file, alih-alih mengabaikannya. Adakah yang bisa menunjukkan bagaimana saya harus menangani ini dengan lebih baik? Terima kasih atas bantuannya.
Skrip (salah) saya:
#!/bin/bash
for THISFILE in *
do
filename=${THISFILE%\.*}
extension=${THISFILE##*\.}
newname=${filename//./_}
echo "mv $THISFILE ${newname}.${extension}"
#mv $THISFILE ${newname}.${extension}
done
Input sampel:
1.3MN-Pin-Eurotunnel-Stw505.51.024-EGS-130x130.jpg
Wear-Plates.jpg
Keluaran:
mv 1_3MN-Pin-Eurotunnel-Stw505_51_024-EGS1-130x130.jpg 1_3MN-Pin-Eurotunnel-Stw505_51_024-EGS1-130x130.jpg
mv Wear-Plates_jpg.Wear-Plates_jpg Wear-Plates_jpg.Wear-Plates_jpg
tar.gz
file? Anda ingin mereka menyelesaikannyafile.tar.gz
, bukanfile_tar.gz
.Jawaban:
Saya percaya bahwa program ini akan melakukan apa yang Anda inginkan. Saya telah mengujinya dan berfungsi pada beberapa kasus menarik (seperti tidak ada ekstensi sama sekali):
Masalah utama yang Anda miliki adalah bahwa
##
ekspansi tidak melakukan apa yang Anda inginkan. Saya selalu menganggap ekspansi parameter shell di bash sebagai sesuatu dari seni hitam. Penjelasan dalam manual ini tidak sepenuhnya jelas, dan mereka tidak memiliki contoh pendukung tentang bagaimana ekspansi seharusnya bekerja. Mereka juga agak samar.Secara pribadi, saya akan telah menulis sebuah skrip kecil
sed
yang mengotak-atik nama seperti yang saya inginkan, atau menulis skrip kecilperl
yang hanya melakukan semuanya. Salah satu orang yang menjawab mengambil pendekatan itu.Satu hal lain yang ingin saya tunjukkan adalah penggunaan kutipan saya. Setiap kali saya melakukan apa pun dengan skrip shell, saya mengingatkan orang untuk sangat berhati-hati dengan kutipan mereka. Sumber besar masalah dalam skrip shell adalah shell menafsirkan hal-hal yang tidak seharusnya. Dan aturan mengutipnya jauh dari jelas. Saya percaya skrip shell ini bebas dari mengutip masalah.
sumber
Gunakan
for thisfile in *.*.*
(yaitu, loop file dengan dua titik atau lebih dalam namanya). Ingatlah untuk mengutip variabel Anda dan gunakan--
untuk menandai akhir opsi seperti padamv -- "$thisfile" "$newname.$extension"
Dengan zsh.
sumber
Bagaimana dengan ini:
PENOLAKAN: coba dulu pada direktori dummy, saya belum mengujinya!
sumber
/
.Sepertinya beberapa jawaban yang baik sudah tersedia, tetapi berikut ini menggunakan
tr
dansed
:sumber
sed
memutuskan mana yang.*
akan digunakan untuk mengunyah maksimal? Saya akan merasa jauh lebih baik tentang hal itu jika kedua.*
adalah[^_]*
.\t
karakter di dalamnya.echo -n "$file"
akan bekerja. :-) Oh, dan"
sekitar$( ... )
ekspresi (alias"$( ... )"
) akan melakukannya.Versi ini memungkinkan Anda secara eksplisit memilih jumlah titik yang ingin Anda pertahankan, mulai dari sisi kanan.
Itu juga akan mengganti dan / atau menghapus karakter lain selain titik-titik, dan karakter pengganti
-
bukan garis bawah, tetapi ini dapat dengan mudah diubah.sumber