Ada batas maksimum untuk berapa lama daftar argumen bisa untuk perintah sistem - batas ini adalah distro-spesifik berdasarkan nilai MAX_ARG_PAGES
ketika kernel dikompilasi, dan tidak dapat diubah tanpa mengkompilasi ulang kernel.
Karena cara globbing ditangani oleh shell, ini akan memengaruhi sebagian besar perintah sistem saat Anda menggunakan argumen yang sama ("* .jpg"). Karena glob diproses oleh shell terlebih dahulu, dan kemudian dikirim ke perintah, perintah:
cp -uf *.jpg /targetdir/
pada dasarnya sama dengan shell seolah-olah Anda menulis:
cp -uf 1.jpg 2.jpg ... n-1.jpg n.jpg /targetdir/
Jika Anda berurusan dengan banyak jpeg, ini bisa menjadi tidak terkelola dengan sangat cepat. Bergantung pada konvensi penamaan Anda dan jumlah file yang sebenarnya harus Anda proses, Anda dapat menjalankan perintah cp pada subset direktori yang berbeda secara bersamaan:
cp -uf /sourcedir/[a-m]*.jpg /targetdir/
cp -uf /sourcedir/[n-z]*.jpg /targetdir/
Ini bisa berhasil, tetapi seberapa efektif itu akan didasarkan pada seberapa baik Anda dapat memecah daftar file Anda menjadi blok globbable nyaman.
Globbable. Saya suka kata itu.
Beberapa perintah, seperti find dan xargs , dapat menangani daftar file besar tanpa membuat daftar argumen dengan ukuran yang menyakitkan.
find /sourcedir/ -name '*.jpg' -exec cp -uf {} /targetdir/ \;
Argumen -exec akan menjalankan sisa baris perintah satu kali untuk setiap file yang ditemukan oleh find , menggantikan {} dengan setiap nama file yang ditemukan. Karena perintah cp hanya dijalankan pada satu file pada satu waktu, batas daftar argumen tidak menjadi masalah.
Ini mungkin lambat karena harus memproses setiap file secara individual. Menggunakan xargs dapat memberikan solusi yang lebih efisien:
find /sourcedir/ -name '*.jpg' -print0 | xargs -0 cp -uf -t /destdir/
xargs dapat mengambil daftar file lengkap yang disediakan oleh find , dan memecahnya menjadi daftar argumen ukuran yang dapat dikelola dan menjalankan cp pada masing-masing sublists tersebut.
Tentu saja, ada juga kemungkinan hanya mengkompilasi ulang kernel Anda, menetapkan nilai yang lebih besar MAX_ARG_PAGES
. Tetapi mengkompilasi ulang kernel lebih berhasil daripada yang saya ingin jelaskan dalam jawaban ini.