(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'

おすすめ記事