play
という名前のフォルダがあります。このフォルダにはdamn file
(スペースあり)。 find
を使用して出力をtar
にパイプすると、次のようになります。
find play/ -name 'damn*' | tar cf archive.tar -T -
それは完璧に動作します。なぜこれが機能するのかfind
の出力には、tar
に問題を引き起こすはずのスペースが含まれています。このコマンドを使用すると:
tar cf archive.tar $(find play/ -name 'damn*')
bashはこれらのエラーを示しています:
tar: play/damn: Cannot stat: No such file or directory
tar: file: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
よくわかりません。最初の例が機能するのはなぜですか?
2番目の例では、改行はシェルによって削除されます。シェルは、コマンド置換の出力でワード分割を行います。改行はデフォルトでIFS
に含まれているため、フィールド自体の一部としてではなく、フィールド区切り文字として扱われます。最初の例では、入力はシェルではなくパイプからのものであるため、シェルはワード分割を実行できません。
コマンド置換("$(find ... )"
)を二重に引用すると、単語の分割が行われなくなりますが、コマンド置換内のfind
は、ほとんどの場合badのアイデアなので、実行しないでください。それ。安全性を最大限に高めるために、UnixツールのGNUバージョンにアクセスできる場合は常に、null区切り文字オプションを使用する必要があります。
find dir/ -name '...' -print0 | tar cf foo.tar --null --no-recursion -T -