Saya ingin mem-pipe nama file ke program lain, tetapi semuanya tersedak ketika namanya mengandung spasi.
Katakanlah saya memiliki file yang dipanggil.
foo bar
Bagaimana saya bisa findmengembalikan nama yang benar?
Jelas saya ingin:
foo\ bar
atau:
"foo bar"
EDIT : Saya tidak ingin melanjutkan xargs, saya ingin mendapatkan string yang diformat dengan benar findsehingga saya dapat menyalurkan string nama file secara langsung ke program lain.
findmemformat nama file dengan baik; mereka dituliskan satu nama per baris. (Tentu saja, ini ambigu jika nama file mengandung karakter baris baru.) Jadi masalahnya adalah penerima menerima "tersedak" ketika mendapat spasi, yang berarti Anda harus memberi tahu kami apa yang menjadi penerima adalah jika Anda ingin jawaban yang bermakna .
findmenawarkan opsi untuk menampilkan nama file dalam format yang sesuai untuk shell. Namun, secara umum, ekstensi -print0GNU findberfungsi dengan baik untuk banyak skenario lain (juga), dan Anda harus belajar menggunakannya dalam peristiwa apa pun.
ls $(command...)tidak memberi makan daftar melalui stdin. Ini menempatkan output $(command...)langsung ke baris perintah. Dalam hal ini, itu adalah shell yang membaca dari c, dan itu akan menggunakan nilai saat ini $IFSuntuk memutuskan bagaimana kata-kata mencantumkan output. Secara umum, Anda lebih baik menggunakan xargs. Anda tidak akan melihat hit kinerja.
find -printf '"%p"\n'akan menambahkan tanda kutip ganda di sekitar setiap nama yang ditemukan, tetapi tidak akan mengutip dengan benar tanda kutip ganda dalam nama file. Jika nama file Anda tidak memiliki tanda kutip ganda yang disematkan, Anda dapat mengabaikan masalah: atau menyalurkannya sed 's/"/&&/g;s/^""/"/;s/""$/"/'. Jika nama file Anda akhirnya ditangani oleh shell, Anda mungkin harus menggunakan tanda kutip tunggal, bukan tanda kutip ganda, (jika tidak sweet$HOMEakan menjadi sesuatu seperti sheet/home/you). Dan ini masih sangat tidak kuat terhadap nama file dengan baris baru di dalamnya. Bagaimana Anda ingin mengatasinya?
-execbendera tersebutfind? Anda berpotensi mengurangi kesalahan ini dan membuat perintah Anda lebih efisien dengan melakukan-execalih - alih mengirimnya ke perintah lain. Just my $ .02