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 find
mengembalikan 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 find
sehingga saya dapat menyalurkan string nama file secara langsung ke program lain.
find
memformat 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 .
find
menawarkan opsi untuk menampilkan nama file dalam format yang sesuai untuk shell. Namun, secara umum, ekstensi -print0
GNU find
berfungsi 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 $IFS
untuk 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$HOME
akan menjadi sesuatu seperti sheet/home/you
). Dan ini masih sangat tidak kuat terhadap nama file dengan baris baru di dalamnya. Bagaimana Anda ingin mengatasinya?
-exec
bendera tersebutfind
? Anda berpotensi mengurangi kesalahan ini dan membuat perintah Anda lebih efisien dengan melakukan-exec
alih - alih mengirimnya ke perintah lain. Just my $ .02