Bagaimana cara menghapus karakter tambahan dalam nama file di Bash?

13

Saya memiliki banyak file media seperti di bawah ini:

tvshow.s01e11]Bloodlines.avi
tvshow.s01e12]suffer.avi
tvshow.s01e13]NotMe.avi

Saya ingin mengubah nama mereka menjadi

tvshow.s01e11.avi
tvshow.s01e12.avi
tvshow.s01e13.avi

Saya sudah mencoba menggunakan rename tetapi ternyata saya tidak mendapatkan sintaks yang benar karena gagal.

Widgeteye
sumber
Jika Anda ingin melakukan ini dalam gui, krenameitu indah. Ini memiliki segala macam opsi yang kuat dan menunjukkan kepada Anda apa yang akan dilakukan sebelum benar-benar melakukannya. Anda bahkan bisa menggunakannya untuk menguji pola yang bisa Anda gunakan di bash nanti.
Joe

Jawaban:

14

Dalam shell, seseorang dapat melakukannya dengan mudah:

for x in *]*.avi ; do 
    mv -i "$x" "${x%]*.avi}.avi"
done

Shell dapat menghasilkan daftar nama file hanya dengan bola dunia biasa, dan ${var%pattern}menghapus pola pencocokan (terpendek) dari akhir string dalam variabel var. Karena ekstensi terakhir selalu .avi, saya hanya menghapusnya dengan pola dan menambahkannya kembali. Dengan tanda kutip, ini harus bekerja dengan nama file yang mengandung spasi jugaFancy Name for a Show.s01e01]Asdf.avi

ilkkachu
sumber
@NoviceC pola extglob bukan ide yang buruk. Sebenarnya, sesuatu seperti yang ${x/]*([^.])}harus dilakukan, itu menghilangkan braket dan sejumlah non-titik. (Meskipun gagal jika ada tanda kurung atau titik-titik lain, karena tidak dikunci sampai akhir string)
ilkkachu
Itu poin yang bagus. Tapi saya benar-benar hanya memperumit masalah ketika saya harus pergi ${x/]*.avi}dan hanya menambahkan .aviseperti Anda. Tapi saya juga tidak puas dengan bagaimana ruang dalam nama akan pecah (`find . -name '*]*.avi'`). Saya senang memberikan metode perintah unix standar yang terbatas, karena mengubah nama tidak, tapi ini membuat saya keluar dari air.
Novice C
2

Ini semua tidak praktis - jawaban lainnya jauh lebih cepat dan lebih pendek - tetapi ...

Anda dapat menggunakan PowerShell! Microsoft membuka-sumbernya baru-baru ini dan membuatnya lintas platform. Untuk unduhan dan instruksi instalasi untuk OS Anda, lihat bagian "Dapatkan PowerShell" .

Setelah Anda menginstalnya, Anda dapat menggunakan skrip singkat ini:

Get-ChildItem -File '*]*.avi' | ForEach-Object {
    Rename-Item $_ -NewName (($_.Name -Split ']')[0] + '.avi')
}

Pada dasarnya, ia melewati setiap objek dalam direktori saat ini yang merupakan file yang cocok *]*.avi, mendapatkan bagian sebelum braket, mengemasnya .avikembali, dan menetapkan itu sebagai nama baru.

Untuk menjalankannya langsung dari Bash, gunakan one-liner semi-golfed ini:

powershell -command $'gci -File \'*]*.avi\'|%{rename-item $_ -NewName (($_.Name -Split \']\')[0]+\'.avi\')}'

Kutipan yang keluar dari jawaban Stack Overflow ini .

(Diuji di Bash di Ubuntu pada Windows. Mungkin ada cara yang jauh lebih singkat untuk melakukannya dengan PowerShell, tapi saya ingin menunjukkan sesuatu yang dapat dipahami oleh orang-orang yang tidak tahu ekspresi reguler.)

Ben N
sumber
Rube Goldberg akan bangga! Regex adalah PITA yang nyata untuk dipelajari, tetapi mereka layak untuk dilakukan berkali-kali - bahkan pada tingkat dasar saya dapat menggunakannya.
Joe
1

Debian memiliki paket yang disebut mmv yang mungkin juga tersedia di distro lain, dan harus cukup mudah dikompilasi dari sumber jika tidak. Anda dapat menulis ini:

mmv '*]*.avi' '#1.avi'

Anda dapat membaca halaman manual Ubuntu untuk perintah ini untuk lebih jelasnya.

MvG
sumber
0

Ini akan mencari pola dan mengganti teks menggunakan sed.

 $sed 's/\(.*]\)[a-zA-z0-9].*\(.avi\)/\1\2/' filename
Tejender Mohan
sumber