ファイル名を他のプログラムにパイプしたいのですが、名前にスペースが含まれているとそれらはすべて窒息します。
というファイルがあるとします。
foo bar
find
正しい名前を返すにはどうすればよいですか?
明らかに私は欲しい:
foo\ bar
または:
"foo bar"
編集:私は通過したくないxargs
、私find
はファイル名の文字列を別のプログラムに直接パイプできるように、正しくフォーマットされた文字列を取得したい。
find
ファイル名を適切にフォーマットします。1行に1つの名前が書き込まれます。(もちろん、ファイル名に改行文字が含まれている場合、これはあいまいです。)問題は、受信側がスペースを取得するときに「チョーク」することです。つまり、意味のある回答が必要な場合は、受信側を教えてください。
find
シェルに適した形式でファイル名を出力するオプションを提供することは理にかなっています。ただし、一般的には、-print0
GNU find
拡張機能は他の多くのシナリオでも問題なく機能します(あまりにも)。いずれにしても、それを使用することを学ぶ必要があります。
ls $(command...)
リストをフィードしませんstdin
。の出力を$(command...)
コマンドラインに直接配置します。その場合、cから読み取っているのはシェルであり、現在の値を使用して$IFS
、出力を単語分割する方法を決定します。一般に、を使用する方が適切ですxargs
。パフォーマンスが低下することはありません。
find -printf '"%p"\n'
見つかった各名前の周りに二重引用符を追加しますが、ファイル名の二重引用符を適切に引用しません。ファイル名に二重引用符が埋め込まれていない場合は、問題を無視できます:またはパイプスルーしsed 's/"/&&/g;s/^""/"/;s/""$/"/'
ます。ファイル名がシェルによって処理されることになった場合は、おそらく二重引用符ではなく単一引用符を使用する必要があります(そうでない場合sweet$HOME
はのようになりますsheet/home/you
)。そして、これは、改行が含まれるファイル名に対してはまだそれほど堅牢ではありません。それらをどのように処理しますか?
-exec
フラグを知っていfind
ますか?潜在的にこのエラーを軽減-exec
し、他のコマンドにパイプする代わりに行うことで、コマンドをより効率的にすることができます。ちょうど私の$ .02