Jika saya memiliki direktori yang berisi beberapa file yang namanya memiliki spasi, mis
$ ls -1 dir1
file 1
file 2
file 3
Saya dapat dengan sukses menyalin semuanya ke direktori lain seperti ini:
$ find dir1 -mindepth 1 -exec cp -t dir2 {} +
Namun, output find dir1 -mindepth 1
berisi ruang yang tidak terhindar:
$ find dir1 mindepth 1
dir1/file 1
dir1/file 3
dir1/file 3
Jika saya menggunakan print0
alih-alih print
, output masih berisi ruang yang tidak terhindar:
$ find dir1 mindepth 1 -print0
dir1/file 1dir1/file 2dir1/file 3
Untuk menyalin file-file ini secara manual menggunakan cp
, saya harus melarikan diri dari ruang; tetapi tampaknya ini tidak perlu ketika cp
agitasi berasal find
, terlepas dari apakah saya menggunakan +
atau \;
pada akhir perintah.
Apa alasannya?
find..exec
dapat menangani nama file aneh sendiri ..Pertanyaannya adalah dua bagian:
find
berhasil program panggilan menggunakan-exec
tanpa berlari ke masalah dengan ruang tertanam dalam nama file, dan-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 :Itu " terutama yang
-print0
utama" mengacu pada GNUfind
danxargs
yang memecahkan masalah dengan cara yang berbeda. Ini juga didukung oleh FreeBSDfind
danxargs
. Jika Anda menambahkan-0
opsi (lihat halaman manual ) kexargs
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 untukcp
: yang tidak ditemukan di POSIX cp . Sebaliknya, ini adalah ekstensi (alias "fitur tidak standar") yang disediakan oleh GNU cp . The-0
perpanjanganxargs
tidak akan memperbaiki contoh ini, tetapi ada kasus lain di mana ia dapat digunakan secara efektif-dengan mengingat bahwa ada alternatif portabel+
, yang GNUfind
menerima.sumber
( Ini seharusnya komentar tapi terlalu besar. )
Bagi mereka yang suka mencoba berbagai hal:
Buat skrip yang berisi parameter posisi yang diteruskan, sebut saja
list_positional_parameters.sh
.Jalankan
find
dengan itu di beberapa direktori $ dir:Seperti yang diharapkan, hanya ada satu parameter di semua panggilan, nama file, apakah ada spasi dalam namanya atau tidak.
sumber
printf
sukaprintf '"%s"\n' "$@"
mencetak semua argumen posisi yang dikutip, untuk inspeksi visual.