シェルLinux Unix xargs -i文字列の置き換え

シェルLinux Unix xargs -i文字列の置き換え

このコマンドのxargs部分を理解するのに問題があります。

find -type f | sed 's/ /\\ /g' | xargs -ifil file fil | \
   grep ELF | grep executable | cut -d: -f1 | xargs -ifil find fil -exec chmod 744 {} \;

私の理解は次のとおりです。ディレクトリの代わりにファイルを見つけて""を"\"に置き換えて、出力をxargsに供給してコマンドファイルに渡しますか?なぜ代わり-iに使用するのですか?その後、ELFと実行可能ファイルをgrepし、:区切り文字を使用して最初の列を取得し、chmod 744と同じオプションを使用してxargsを再実行しますか?

答え1

はい、(廃止予定)代替品です。 GNUのマニュアルページでは、その機能について説明します。-istr-I str-I

-I replace-str
      Replace  occurrences  of  replace-str  in the initial-arguments with 
      names read from standard input.  Also, unquoted blanks do not termi‐
      nate  input  items;  instead the separator is the newline character. 
      Implies -x and -L 1.

つまり、-ixxx(または-Ixxx)を使用すると、コマンドを実行する前に、指定されたコマンドの文字列をxargs現在の項目に置き換え、複数の項目を積み重ねるのではなく、各入力行に対して指定されたコマンドを1回実行します。コマンドは単一項目内で呼び出されます。プロジェクトを実行し、スペースで区切られた文字列を別のプロジェクトとして扱います。xxxxargs

たとえば、このechoコマンドは2回実行され、xxx必要に応じて両方の入力行の内容を置き換えます。

$ printf "foo bar\nqwerty\n" | xargs -ixxx echo ":xxx:xxx:"
:foo bar:foo bar:
:qwerty:qwerty:

関連情報