ファイル名を他のプログラムにパイプしたいのですが、名前にスペースが含まれているとそれらはすべて窒息します。
というファイルがあるとします。
foo bar
find正しい名前を返すにはどうすればよいですか?
明らかに私は欲しい:
foo\ bar
または:
"foo bar"
編集:私は通過したくないxargs、私findはファイル名の文字列を別のプログラムに直接パイプできるように、正しくフォーマットされた文字列を取得したい。
findファイル名を適切にフォーマットします。1行に1つの名前が書き込まれます。(もちろん、ファイル名に改行文字が含まれている場合、これはあいまいです。)問題は、受信側がスペースを取得するときに「チョーク」することです。つまり、意味のある回答が必要な場合は、受信側を教えてください。
findシェルに適した形式でファイル名を出力するオプションを提供することは理にかなっています。ただし、一般的には、-print0GNU 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