Pertanyaannya adalah dua bagian:
- bagaimana tidak
find berhasil program panggilan menggunakan -exectanpa berlari ke masalah dengan ruang tertanam dalam nama file, dan
- apa
-print0pilihannya?
Untuk yang pertama, findmembuat panggilan sistem, sebenarnya salah satu dari sekelompok panggilan terkait yang disebut sebagai "exec" . Itu meneruskan nama file sebagai argumen langsung ke panggilan ini, yang kemudian diteruskan secara langsung (setelah membuat proses baru) tanpa kehilangan informasi tentang nama file.
POSIX findfitur +dijelaskan sebagai berikut, dalam pemikiran :
Fitur findutilitas SVR4 adalah -execterminator + primer. Ini memungkinkan nama file yang mengandung karakter khusus (terutama karakter baris baru ) untuk dikelompokkan bersama tanpa masalah yang terjadi jika nama file tersebut disalurkan ke xargs. Implementasi lain telah menambahkan cara lain untuk mengatasi masalah ini, terutama -print0primer yang menulis nama file dengan terminator null byte. Ini dianggap di sini, tetapi tidak diadopsi. Menggunakan null terminator berarti bahwa utilitas apa pun yang akan memproses -print0keluaran find
harus menambahkan opsi baru untuk mengurai null terminator yang sekarang dibaca.
Itu " terutama yang -print0utama" mengacu pada GNU finddan xargsyang memecahkan masalah dengan cara yang berbeda. Ini juga didukung oleh FreeBSD finddan xargs. Jika Anda menambahkan-0 opsi (lihat halaman manual ) ke xargspanggilan, maka program itu menerima baris yang diakhiri oleh karakter "byte nol". Pada gilirannya, xargsmemanggil fungsi exec untuk melakukan tugasnya . Perbedaan utama antara fitur -print0dan -0versus +fitur adalah bahwa yang pertama melewati nama file di atas pipa, sedangkan yang terakhir tidak. Pengembang menemukan kegunaan untuk hampir semua fitur; pipa tidak terkecuali.
Kembali ke contoh OP, yang menggunakan -topsi untuk cp: yang tidak ditemukan di POSIX cp . Sebaliknya, ini adalah ekstensi (alias "fitur tidak standar") yang disediakan oleh GNU cp . The -0perpanjangan xargstidak akan memperbaiki contoh ini, tetapi ada kasus lain di mana ia dapat digunakan secara efektif-dengan mengingat bahwa ada alternatif portabel +, yang GNU findmenerima.
find..execdapat menangani nama file aneh sendiri ..