Ganti nama file dengan satu perintah baris

10

Saya memiliki direktori ini, dan ingin mengubah nama file:

===> ls -1 Der-vierte-Weise/
10 - 10 - Erkenntniss.ogg
1 - 01 - Hoffnung.ogg
11 - 11 - Wahrheit.ogg
12 - 12 - Dankbarkeit.ogg
13 - 13 - Kredits.ogg
2 - 02 - Familie.ogg
3 - 03 - Demut.ogg
4 - 04 - Freude.ogg
5 - 05 - Schoenheit.ogg
6 - 06 - Solidaritaet.ogg
7 - 07 - Entscheidung.ogg
8 - 08 - Hilfe.ogg
9 - 09 - Unterstuetzung.ogg

Hasilnya akan terlihat seperti ini:

===> ls -1 Der-vierte-Weise/
01 - Hoffnung.ogg
02 - Familie.ogg
...

Saya ingin menyelesaikan ini dengan alat shell umum.

guettli
sumber
1
Saya ingin menyelesaikan ini dengan alat shell umum. Saya tidak mengatakan bahwa Anda tidak memiliki alasan yang baik, tetapi saya percaya Anda telah bertanya dan menjawab pertanyaan pada diri sendiri "mengapa?". Terakhir kali saya memiliki masalah yang sangat mirip untuk diselesaikan, saya segera mendorong Bash ke satu sisi dan menyelesaikannya dengan Python. Jauh lebih mudah (tapi saya sudah tahu Python, metode string, glob.glob dan os.rename - dan saya juga harus mengulangi pohon penuh nama folder dengan spasi dan karakter canggung lainnya, tidak ada yang merupakan penyebab tambahan mengganggu jika menggunakan Python)
nigel222
1
@ nigel222 Saya malas dan saya ingin mengetikkan sesedikit mungkin karakter. Itu sebabnya saya tidak ingin menggunakan python di sini. Jangan salah sangka. Hingga kini Python adalah bahasa pemrograman pilihan saya dan menggunakannya setiap hari.
guettli

Jawaban:

18

Anda bisa menggunakan rename...

rename -n 's/^[0-9]+ - //' *

Hapus -nsetelah pengujian untuk benar-benar mengganti nama file

Penjelasan

  • s/old/new/ganti olddengannew
  • ^ mulai dari string
  • [0-9]+ beberapa angka
Zanna
sumber
jenis bunga regex apa yang didukung oleh renamealat ini. Apakah ini menggunakan PCRE? ... akan luar biasa.
guettli
5
@guettli secara tegas, bukan itu PCRE (itu Ekspresi Reguler Kompatibel Perl ). Ini renameadalah skrip Perl sehingga memiliki dukungan ekspresi reguler Perl penuh; PCRE hanya sebagian dari itu. Namun, apa pun yang Anda ketahui dari PCRE akan berlaku untuk rename.
terdon
@terdon Saya tidak peduli dengan implementasinya. Jika Anda melihatnya dengan kacamata matematika, maka renamememiliki ekspresi reguler yang kompatibel dengan perl. Ya, implementasi pcre tidak digunakan. Saya mengerti ini :-) Terima kasih atas balasan cepat Anda.
guettli
9

bash ekspansi parameter untuk menghapus bagian yang diperlukan dari awal:

for f in *[[:blank:]]*.ogg; do echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Formulir diperluas:

for f in *[[:blank:]]*.ogg; do 
    echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"
done

echountuk pengeringan; singkirkan itu untuk tindakan nyata:

for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Contoh:

% ls -1
1 - 01 - Hoffnung.ogg
2 - 02 - Familie.ogg

% for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done 

% ls -1                                                                             
01 - Hoffnung.ogg
02 - Familie.ogg
heemayl
sumber
Ya, berhasil. Terima kasih. Karena saya tahu perl ekspresi reguler yang kompatibel dari Python (yang saya gunakan setiap hari), saya lebih suka renameperintah. (Kurang mengetik perlu).
guettli
1
@guettli renameadalah cara untuk pergi jika Anda terbiasa dengan PCRE; yang renamejawabannya sudah diberikan sehingga harus pindah dengan murni bash. Hanya untuk catatan, python's re(atau regex) modul tidak sepenuhnya PCRE kompatibel BTW.
heemayl
@guettli. Apakah Anda baru saja menurunkan jawaban saya? : O
heemayl
Ya saya lakukan, dan saya membenarkan komentar Anda. Saya harap Anda tidak tersinggung. Jangan salah sangka, tapi pendapat pribadi saya adalah ini ${f#[[:digit:]]*-[[:blank:]]}jelek. Ya itu berhasil. Tapi kita hidup di abad ke-21. Saya pikir sudah saatnya untuk beralih dari "itu bekerja" ke "itu mudah dan menyenangkan". Jika "itu berfungsi" adalah tujuannya, maka linux tidak akan pernah lepas dari prasangka tidak ramah pengguna. Karena Anda sudah mendapatkan banyak suara, suara yang satu ini seharusnya tidak sakit (saya harap). Jika ya, beri tahu saya, dan saya akan mengambilnya kembali.
guettli
1
@guettli Apa pun yang cocok untuk Anda. Di sini: gnu.org/software/bash/manual/html_node/… Sebagai catatan, kelas karakter [[:digit:]]dan [[:blank:]]ada di sana untuk mematuhi Anda locale, ini juga cukup umum di Regex.
heemayl