Saat membaca tutorial tentang pengubahan nama file batch di bash dan menggunakan sort
perintah untuk mengurutkan konten file, saya belum bisa menemukan cara menggabungkan keduanya.
Saya memiliki direktori yang isinya diurutkan menggunakan tag di dalam nama file, mirip dengan bagaimana program TagSpaces menangani hal-hal. Saya menambahkan tag apa pun yang dapat saya pikirkan sampai akhir nama file ketika saya membuatnya atau mengunduhnya. Ini sebuah contoh:
Sunrise (2) #wallpaper #4k #googleimages.jpg
Sekarang saya ingin memeriksa semua file ini dan mengganti nama mereka sehingga tag diurutkan berdasarkan abjad, tanpa mempengaruhi apa pun sebelum atau setelah tag (misalnya judul gambar atau ekstensi file). Jadi di atas akan menjadi:
Sunrise (2) #4k #googleimages #wallpaper.jpg
Bagaimana saya mencapai ini? Aku bahkan tidak bisa mencari cara untuk melewati file nama , dan tidak isinya, untuk perintah seperti sort
, yang output aku bisa maka mungkin pipa ke mv
.
Jawaban:
Pengujian:
sumber
Jika Anda memiliki berbasis perl
rename
(prename
pada beberapa sistem) maka Anda dapat melakukan split + mengurutkan tag menggunakan perl. Misalnya diberikanlalu (dengan beberapa pertikaian jelek untuk menghapus dan mengganti
.jpg
akhiran)Memeriksa
Mungkin banyak ruang untuk perbaikan - tapi saya harap ini memberi Anda beberapa ide.
sumber
Dengan
zsh
:(lepaskan
-n
(dry-run) jika senang).[^#]#
: 0 atau lebih karakter bukan # (#
seperti*
di regexps)s: :
terpecah pada ruango
: order (sort)j: :
: gabung dengan ruang.Jadi, kami membagi bagian di antara yang pertama
#
(termasuk) dan terakhir.
(dikecualikan) pada ruang, mengurutkan daftar hasil yang kami gabungkan kembali dengan ruang.Secara rekursif:
Untuk mengizinkan spasi dalam nama tag, kami dapat membagi
#
dan memangkas spasi tambahan, mengurutkan dan bergabung#
dengan:Tambahkan
(#qD)
kualifikasi glob jika Anda juga ingin memproses file tersembunyi (D
atau file) atau ingin memproses file dalam direktori tersembunyi.sumber
Pertanyaan bagus!
Berikut ini
bash
skrip sederhana saya untuk ini:Penjelasan:
Di
afile=( ${file#*)} );
: kami mengonversi string ke array. Dalam keadaan ini shell sedang melakukan pemisahan kata dengan spasi kecuali Anda mengutip string.Dalam
${file#*)}
( cut-up-to-first-prefix ): kita menanggalkan semuanya dari awal string hingga pertama kali)
terlihat menggunakanshell parameter expansion
karena akan menghasilkan#wallpaper #4k #googleimages.jpg
mempertimbangkanfile="Sunrise (2) #wallpaper #4k #googleimages.jpg"
Di
${file%%#*}
( cut-up-to-last-suffix ); pengupasan mulai dari ujung ke pengemis tali sampai terakhir#
terlihat. ini akan menghasilkanSunrise (2)
Di dalam
${afile[@]%%.*}
( cut-up-to-last-suffix ): sama seperti di atas, stripping mulai dari ujung hingga mengemis string (di sini di setiap array yang diindeks) sampai terakhir.
terlihat. ini akan menghasilkan#wallpaper #4k #googleimages
, kita juga bisa menggunakan${afile[@]%.*}
lebih baik!Di
printf "%s\n" "${afile[@]%%.*}"
: kita mencetak elemen array dengan baris baru ([@]
digunakan untuk array yang diindeks), (mengapa dengan baris baru? Karena kita akan mengurutkannya dan kita harus membagi elemen dalam baris baru)Di
$(sort<(printf "%s\n" "${afile[@]%%.*}"))
: kami menyortir elemen (atau tag).Dalam
$(echo $(sort<(printf "%s\n" "${afile[@]%%.*}")))
: sama seperti di atas tetapi kami menggunakanecho
perintah tambahan untuk mengumpulkan elemen yang diurutkan menjadi satu linier.mungkin sama juga dengan menggunakan double
xargs
like... |xargs -n1| sort | xargs
.Silakan lihat contoh di bawah ini untuk lebih memahami langkah ini:
Akhirnya pada akhirnya,
mv
perintahnya adalah mengubah$file
nama menjadi nama yang dimodifikasi.Ps: hapus
echo mv ...
di depanmv
untuk keluar dari dry-run dan melakukan penggantian nama sebenarnya.sumber
Tampaknya ini agak terlalu rumit untuk jujur bagi Bash. Bukan tidak mungkin, tetapi menurut saya, Anda jauh lebih baik menggunakan bahasa yang dibuat untuk pemrograman "nyata" di sini. Solusi Bash kemungkinan tidak akan dapat dipertahankan. (Tidak mencoba untuk menghina solusi Bash-only, saya pikir mengubah nama-sihir sangat menakjubkan, sebenarnya)
Yang mengatakan, inilah solusi dengan Ruby. Anda dapat menulisnya ke file dan kemudian jalankan file dari dalam shell Anda, mengingat bahwa Anda telah menginstal Ruby.
Untuk menjalankan skrip, cukup letakkan di direktori tempat gambar Anda berada. Solusi ini harus cukup tangguh untuk nama gambar dan tag konyol seperti
C#
tidak akan menimbulkan masalah. Yang mengatakan, pastikan untuk membuat cadangan sebelum menjalankan skrip. Operasi gerakan bisa sama destruktifnya dengan arm
.sumber