Saya sedang mencari cara untuk mengubah nama sejumlah besar file dengan nama yang sama, mirip seperti ini (pertanyaan yang berhubungan dengan Windows) kecuali bahwa saya menggunakan * nix (Ubuntu dan FreeBSD, secara terpisah). Singkatnya, saat menggunakan shell (Bash, CSH, dll.) Bagaimana cara mengubah nama massal sejumlah file sedemikian rupa, misalnya, file-file berikut:
Beethoven - Fur Elise.mp3
Beethoven - Moonlight Sonata.mp3
Beethoven - Ode to Joy.mp3
Beethoven - Rage Over the Lost Penny.mp3
akan diganti nama seperti ini?
Fur Elise.mp3
Moonlight Sonata.mp3
Ode to Joy.mp3
Rage Over the Lost Penny.mp3
Alasan saya ingin melakukan ini adalah bahwa kumpulan file ini akan berada di bawah direktori bernama "Beethoven" (yaitu awalan nama file '), dan memiliki informasi ini pada nama file itu sendiri akan menjadi berlebihan.
Seperti banyak hal dengan Linux / Unix, ada lebih dari satu cara untuk melakukannya!
Beberapa mungkin menggunakan mmv (mv massal).
Perintah rename, atau prename yang datang dengan beberapa paket Perl (Ubuntu dan Debian yang lebih baru) dapat melakukan ini juga.
Perhatikan bahwa alat ganti nama pada Fedora 10 bukan program yang sama dengan ini dan bekerja secara berbeda. Ini adalah bagian dari paket yang berbeda, util-linux-ng dan dapat ditemukan di sini .
Saya sering hanya pergi ke shell untuk keluar dari kebiasaan (setelah semua alat seperti itu tidak selalu ada).
Ini akan membuat direktori Beethoven, kemudian memindahkan file ke direktori / nama file, di mana nama file memiliki "Beethoven -" diganti dengan apa pun.
Sebagai ujian, sebelum:
Setelah:
sumber
Coba solusi ini, diimplementasikan menggunakan kombinasi grep dan rename. Ini dengan asumsi Anda memiliki banyak direktori yang perlu Anda ganti namanya. Jika hanya ada beberapa, saya akan menggunakan pendekatan manual, dengan pola "Artis -" yang dikodekan untuk masing-masing.
Penjelasan menemukan :
The find perintah menemukan semua file dengan .mp3 ekstensi dalam hirarki file saat ini, dan menyebut argumen dilewatkan ke exec untuk masing-masing. Perhatikan bahwa di dalam -exec , {} merujuk ke argumen yang dilewati oleh find (path file + name). The
\;
memastikan;
akan diteruskan untuk mengganti nama dan bukannya menunjukkan akhir dari perintah find .Perintah yang diberikan di atas memiliki saklar -n (tidak ada tindakan); maka itu hanya akan memberi tahu Anda apa yang akan terjadi jika Anda menjalankannya. Saya sarankan Anda menjalankan perintah ini tanpa -n beralih hanya setelah Anda menjalankannya sekali dan puas dengan hasil yang diusulkan.
Sekarang untuk regexp.
^
cocok dengan mulai dari string.$
cocok dengan akhir string..
cocok dengan karakter apa pun.*
berarti nol atau lebih dari konstruk sebelumnya. mis..*
berarti nol atau lebih karakter.\s
singkatan karakter ruang apa pun.\S
singkatan karakter non-ruang.()
akan ditangkap dan disajikan sebagai$1
,$2
, tergantung pada posisinya.Regexp:
(.*/)
-
":.*-
(.*)
Inilah pengujian saya:
Regexp adalah bisnis yang rumit, dan saya telah membuat banyak kesalahan menulisnya, jadi saya akan menerima masukan tentang kurangnya jasa yang satu ini. Saya tahu saya menemukan beberapa pengujian ini.
sumber
Saya telah menyusun program Java baris perintah yang membuat pengubahan nama file (dan direktori) menjadi mudah, terutama untuk skrip. Ini gratis dan open source, sehingga Anda dapat memodifikasinya sesuai dengan isi hati Anda:
RenameWand
http://renamewand.sourceforge.net/
Beberapa contoh penggunaan yang relevan:
Pindahkan file formulir
"<a> - <b>"
ke direktori masing-masing"<a>"
:Sortir file berdasarkan waktu yang terakhir diubah, dan ganti namanya dengan angka 3 digit:
Atur ulang bagian nama file, dan ubah huruf besar-kecil:
sumber
zmv
Alat penamaan ulang zsh sangat bagus.Lebih banyak catatan di sini ...
sumber
Untuk kepala Penguin ini mudah dilakukan dalam skrip shell atau skrip AWK. Bagi kami manusia biasa, Anda mungkin ingin mencoba Midnight Commander. Ada di sebagian besar distribusi linux, dari tipe prompt shell mc -a. Anda dapat mengganti nama file menggunakan ekspresi reguler. Saya menggunakan artikel di GeekStuff http://www.thegeekstuff.com/2009/06/how-to-rename-files-in-group/ untuk membantu saya.
sumber
Berikut ini adalah contoh baris perintah sederhana. Saya memiliki kata "putih" di tengah-tengah nama sekelompok file png. Saya ingin mengeluarkannya dan meninggalkan hanya satu garis bawah. Ini berhasil:
sumber
Gunakan vidir dan kemudian gunakan fitur editor Anda untuk menerapkan pola penggantian nama.
sumber
Pada * nix tanpa perl
rename
tersediaPada beberapa * nix tidak ada rename yang tersedia, jadi perlu lakukan rename menggunakan beberapa metode lain. Beberapa tahun yang lalu saya menyarankan di
zmv
sini yang bagus, belum tentu tersedia juga.Dengan menggunakan builtin dan sed, kita dapat dengan cepat menyiapkan skrip shell untuk melakukan ini yang memberi kita sintaksis yang sangat mirip dengan skrip perl rename, sementara kekurangan beberapa kesalahan penanganan kebaikan, itu menyelesaikan pekerjaan.
Pemakaian
Katakanlah kita juga ingin membuat folder target ...
Karena
mv
tidak membuat folder yang tidak bisa kita gunakansedrename
seperti di sini, tapi itu perubahan yang cukup kecil, jadi saya pikir akan lebih baik untuk memasukkannya juga.Kita memerlukan fungsi utilitas,
abspath
(atau jalur absolut) sehingga kita dapat membuat folder target untuk pola sed / rename yang mencakup struktur folder baru.Ini akan memastikan kami mengetahui nama folder target kami. Saat kami mengganti nama, kami harus menggunakannya pada nama file target.
Berikut skrip sadar folder lengkap ...
Tentu saja, itu masih berfungsi ketika kita tidak memiliki folder target spesifik juga.
Jika kami ingin memasukkan semua lagu ke dalam folder,
./Beethoven/
kami dapat melakukan ini:Pemakaian
Putaran bonus ...
Menggunakan skrip ini untuk memindahkan file dari folder ke satu folder:
Dengan asumsi kami ingin mengumpulkan semua file yang cocok, dan menempatkannya di folder saat ini, kami dapat melakukannya:
Perhatikan pada pola sed regex
Aturan pola sed reguler berlaku dalam skrip ini, pola ini bukan PCRE (Perl Regular Regular Expressions). Anda bisa menambahkan sintaks ekspresi reguler yang diperluas, menggunakan salah satu
sed -r
ataused -E
tergantung pada platform Anda.Lihat patuh POSIX
man re_format
untuk deskripsi lengkap dari pola dasar dasar dan regexp diperluas.sumber