(tr \\n \\0

(tr \\n \\0

コンテキスト:https://stackoverflow.com/a/13941223/15603477
わかりました。xargs chmod 755 <file.txt

より多くのファイルまたは入力ファイルのほぼすべての行数の場合...

chown、chmod、rm、cp -tなどの多くのbinutilsツールの場合...

xargs chmod 755 <file.txt

file.txtに特殊文字および/または複数行がある場合。

xargs -0 chmod 755 < <(tr \\n \\0 <file.txt)

(tr \\n \\0 <file.txt)それがどういう意味なのかよくわかりませんか?
存在するマントラ私が見つけたものは次のとおりです。

\\     backslash        
\n     new line

  

答え1

\\バックスラッシュを意味しますが、ここには2つのレベルのエスケープがあります。

まず、シェルはコマンドラインを見て引用符を処理します\\n\n同様に'\n'、orを書くこと"\n"もできます\n

それからそれが改行文字を意味すると思いますtr\nまた、値\\0\00のNULバイトを表します。

アイデアは、パス名を区切るために改行文字を使用する入力をNULバイトを使用してパス名を区切る入力に変換することです。 NULはパス名の唯一の無効な文字であるため、自然な区切り文字であり、入力に対して他の特別な処理を実行できないように-0するオプションでもあります。引用符はデフォルトで処理されます(それ自体はNULと完全に互換性がありません)。シェルの引用規則)、すべてのスペースを区切り文字として扱います。プレーンを使用しないことをお勧めします。xargsxargsxargs

これ-0改行文字しかし、空白や引用符など、他のすべてを表現できます。


これを<(...)プロセス置換といい、コマンドの出力をファイルのように読み取れるように提供します。これはパイプを代わりに使用できるパイプの一般化です。

私は書くことができます

xargs -0 chmod 755 < <(tr \\n \\0 <file.txt)

〜のように

tr '\n' '\0' <file.txt | xargs -0 chmod 755

(再び、\\n= '\n'

答え2

tr \\n \\0\n内容が行区切り文字として機能するヌル終了文字列として入力として渡される\0ように、(改行)文字をNUL文字に置き換えます。入力がスペースと改行で区切られ、スペースが含まれていると機能しないとは予想されません。file.txtxargs -0\0-0 xargsfile.txt

関連情報