Pertanyaan ini didorong oleh pertanyaan tentang opsi ls
' -1
dan kecenderungan berulang orang untuk bertanya dan menjawab yang mencakup pemrosesan keluaran dari ls
.
Penggunaan kembali output ini ls
tampaknya dapat dimengerti, misalnya: jika Anda tahu cara mengurutkan daftar file dengan ls
Anda mungkin ingin menggunakan output dengan cara itu sebagai input untuk sesuatu yang lain.
Jika Q&A tersebut tidak menyertakan referensi ke daftar nama file yang dihasilkan yang terdiri dari nama file berperilaku baik (tidak ada karakter khusus seperti spasi dan baris baru), mereka sering dikomentari oleh seseorang yang menunjukkan bahaya urutan perintah yang tidak berfungsi ketika ada adalah file dengan baris baru, spasi, dll.
find
, sort
dan utilitas lain menyelesaikan masalah mengkomunikasikan nama file "sulit" ke mis. xargs
dengan menggunakan opsi untuk memisahkan nama file dengan NUL karakter / byte yang bukan karakter yang valid dalam nama file (satu-satunya selain /
?) pada Sistem file Unix / Linux.
Saya melihat ke halaman ls
manual dan output untuk ls --help
(yang memiliki lebih banyak opsi terdaftar) dan tidak dapat menemukan bahwa ls
(dari coreutils
) memiliki opsi untuk menentukan output yang dipisahkan oleh NUL. Itu memang memiliki -1
opsi yang dapat diartikan sebagai "nama file keluaran dipisahkan oleh baris baru" )
T : Apakah ada alasan teknis atau filosofis mengapa ls
tidak memiliki --zero
atau -0
opsi yang akan "menampilkan nama file yang dipisahkan oleh NUL"?
Jika Anda melakukan sesuatu yang hanya menampilkan nama file (dan tidak menggunakan mis. -l
) Yang masuk akal:
ls -rt -0 | xargs -r0 …
Saya bisa kehilangan sesuatu mengapa ini tidak berhasil, atau adakah alternatif untuk contoh ini yang saya abaikan dan yang tidak jauh lebih rumit dan / atau tidak jelas .
Tambahan:
Melakukan ls -lrt -0
mungkin tidak masuk akal, tetapi dengan cara yang find . -ls -print0
sama tidak, jadi itu bukan alasan untuk tidak memberikan opsi -0
/ -z
/ --zero
.
sumber
ls -rtz
pasti akan bermanfaat. Bandingkan alternatifnya: superuser.com/a/294164/21402Jawaban:
UPDATE (2014-02-02)
Berkat tekad @ Anthon kami sendiri dalam mengikuti kekurangan fitur ini , kami memiliki alasan yang sedikit lebih formal mengapa fitur ini kurang, yang menegaskan kembali apa yang saya jelaskan sebelumnya:
Jawaban asli saya
Ini sedikit pendapat pribadi saya, tetapi saya yakin itu adalah keputusan desain untuk meninggalkan perubahan itu
ls
. Jika Anda perhatikanfind
perintah memiliki saklar ini:Dengan meninggalkan peralihan itu, para desainer menyiratkan bahwa Anda tidak boleh menggunakan
ls
output untuk apa pun selain konsumsi manusia. Untuk pemrosesan hilir dengan alat lain, Anda harus menggunakanfind
sebagai gantinya.Cara menggunakan find
Jika Anda hanya mencari metode alternatif, Anda dapat menemukannya di sini, berjudul: Melakukannya dengan benar: Ringkasan cepat . Dari tautan itu kemungkinan ada 3 pola yang lebih umum:
(ekstensi umum tidak standar-print0 dan -0. Bekerja pada GNU, * BSDs, busybox)
Bukti lebih lanjut?
Saya menemukan posting blog ini dari blog Joey Hess berjudul: " ls: the missing options ". Salah satu komentar menarik dalam posting ini:
Pencarian lebih lanjut saya menemukan ini di log komit dari salah satu switch tambahan yang posting blog Joey menyebutkan, " format output -j baru ", sehingga tampaknya posting blog itu mengolok-olok gagasan pernah menambahkan
-z
beralih kels
.Referensi
sumber
-0
diimplementasikan) dalam pertanyaan saya, agar tidak membuat orang tersesat.ls -1 | tr '\012' '\000'
akan mencantumkan file yang dipisahkan oleh karakter NULL.Sebagai jawaban @ slm masuk ke asal-usul dan kemungkinan alasan saya tidak akan mengulanginya di sini. Opsi semacam itu tidak ada pada daftar fitur coreutils yang ditolak , tetapi tambalan di bawah ini sekarang ditolak oleh Pádraig Brady setelah mengirimkannya ke mailing list coreutils. Dari jawaban itu jelas ini adalah alasan filosofis (
ls
output untuk konsumsi manusia).Jika Anda ingin mencoba jika opsi semacam itu masuk akal untuk Anda sendiri, lakukan:
kemudian terapkan tambalan berikut terhadap commit b938b6e289ef78815935ffa705673a6a8b2ee98e dd 2014-01-29:
Setelah dibuat lagi, Anda dapat mengujinya dengan:
Jadi tambalan itu berfungsi dan saya tidak bisa melihat alasan mengapa tidak, tapi itu bukan bukti tidak ada alasan teknis untuk meninggalkan opsi.
ls -R0
mungkin tidak masuk akal, tetapi tidak jugals -Rm
yangls
bisa dilakukan di luar kotak.sumber
-z
dan--zero
lebih sesuai dengan sort (juga dalam coreutils.