Pertanyaannya adalah dua bagian:
- bagaimana tidak
find
berhasil program panggilan menggunakan -exec
tanpa berlari ke masalah dengan ruang tertanam dalam nama file, dan
- apa
-print0
pilihannya?
Untuk yang pertama, find
membuat 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 find
fitur +
dijelaskan sebagai berikut, dalam pemikiran :
Fitur find
utilitas SVR4 adalah -exec
terminator + 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 -print0
primer 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 -print0
keluaran find
harus menambahkan opsi baru untuk mengurai null terminator yang sekarang dibaca.
Itu " terutama yang -print0
utama" mengacu pada GNU find
dan xargs
yang memecahkan masalah dengan cara yang berbeda. Ini juga didukung oleh FreeBSD find
dan xargs
. Jika Anda menambahkan-0
opsi (lihat halaman manual ) ke xargs
panggilan, maka program itu menerima baris yang diakhiri oleh karakter "byte nol". Pada gilirannya, xargs
memanggil fungsi exec untuk melakukan tugasnya . Perbedaan utama antara fitur -print0
dan -0
versus +
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 -t
opsi untuk cp
: yang tidak ditemukan di POSIX cp . Sebaliknya, ini adalah ekstensi (alias "fitur tidak standar") yang disediakan oleh GNU cp . The -0
perpanjangan xargs
tidak akan memperbaiki contoh ini, tetapi ada kasus lain di mana ia dapat digunakan secara efektif-dengan mengingat bahwa ada alternatif portabel +
, yang GNU find
menerima.
find..exec
dapat menangani nama file aneh sendiri ..