Saya punya sesuatu yang cukup sederhana yang ingin saya lakukan. Saya ingin menggunakan montage
pada direktori yang berisi ribuan gambar, dengan sedikit pilihan, yaitu:
me@home$ montage -size 256x256 DSC01*.JPG.svg output.png
... tapi itu tidak cukup baik, karena hanya mengambil sekitar 100 gambar sekaligus; tidak juga
me@home$ montage -size 256x256 *.svg output.png
... yang mengambil semua gambar secara bersamaan, karena file yang dihasilkan terlalu besar untuk diurai.
Yang ingin saya lakukan adalah mengulangi lebih dari sekitar 100-200 file sekaligus. Saya kira ini bisa diimplementasikan dengan menggunakan for loop (?), Tapi saya hanya sedikit bingung bagaimana cara melakukannya. Saya kira mungkin ada cara cerdas untuk menggunakannya find -exec
atau xargs
yang tidak saya pikirkan. Saya menggunakan bash
, tetapi saya menggunakan zsh
sesekali.
Jadi, sebagai kesimpulan, saya mencari satu liner yang, diberikan 2600 file gambar, panggilan montase sekitar 13 atau 26 kali (satu kali untuk setiap 100-200 file), dan diberikan n file, dapat disebut kelipatan n kali .
sumber
DSC0100.JPG.svg
...DSC2600.JPG.svg
?Jawaban:
Sebuah
bash
metode, menggunakan array yang khusus fitur; mungkin diterjemahkanzsh
dengan beberapa modifikasi:sumber
Anda dapat menggunakan xargs untuk itu; sayangnya, tidak mungkin untuk menggabungkan -I (untuk menanamkan ke tengah-tengah baris perintah) dan -L (untuk membatasi jumlah file untuk satu panggilan ke executable). Oleh karena itu, saya membuat baris perintah ini sebagai contoh (tapi waspadalah terhadap karakter khusus dalam nama file, mereka tidak didukung):
Hapus
echo
jika Anda ingin benar-benar menjalankan perintah.Peringatan:
Memperbarui:
Ini adalah yang sesuai untuk loop, yang (saya harap) menyelesaikan masalah dengan spasi dalam nama file:
Pembaruan 2: Solusi python, yang seharusnya kebal terhadap karakter khusus dalam nama file
sumber
ls
pipa untuk mengurai hasilnya, Anda juga harus memperingatkan tentang banyak bahaya melakukan hal itu dengan jelas, dan pada awalnya untuk memastikan orang melihatnya.*.svg
(itulah sebabnya saya mengirim komentar pada pertanyaan yang diajukan). Dalam kasus yang paling umum di mana Anda perlu menangani semua nama file, Anda harus menggunakan shell globbing dan array ataufind -print0 | xargs -0
konstruksi. Lihat jawaban saya untuk contoh yang pertama.Ini adalah versi menggunakan xargs yang aman untuk nama file apa pun, tetapi memerlukan file sementara untuk menyimpan hitungan. Sesuaikan '-n 100' untuk menyesuaikan berapa banyak file per montase. Anda juga dapat menukar "printf" dengan "find -print0", tetapi pastikan tidak menemukan "count.temp".
sumber
Dengan GNU Parallel Anda dapat melakukan:
Tentu saja aman untuk file dengan karakter khusus (seperti yang biasanya Anda harapkan dari GNU Parallel).
Instalasi minimal
Jika Anda hanya perlu paralel dan tidak menginstal 'make' (mungkin sistemnya sudah lama atau Microsoft Windows):
Tonton video intro untuk perkenalan cepat: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1 atau di http://tinyogg.com/watch/TORaR/ dan http://tinyogg.com/watch/hfxKj /
sumber