xargs と置換に関するヘルプが必要です

xargs と置換に関するヘルプが必要です

以下のようなコマンドがあり、コマンド内で渡されたパラメータをコマンドxargsに使用する必要がありますechoが、うまくいかないようです。試してみます:

find . -maxdepth 1 -type f -wholename "$1" | xargs -I{} echo -e "<h2>Filename: {}</h2>\n<pre> `cat *`\n</pre>\n<br>
Word Count $(wc -w {})";

ご覧のとおり、これはwc -w {}私のコマンド内では機能せず、xargsリテラルとして扱われます。そして、私が試してみると:

find . -maxdepth 1 -type f -wholename "$1" | xargs -I{} echo -e "<h2>Filename: {}</h2>\n<pre> `cat *`\n</pre>\n<br>
Word Count $(wc -w ${})";

エラー メッセージが表示されます${}... おそらく解析が原因だとはわかっていますが、修正方法がわかりません。誰か助けてくれませんか?

答え1

必要な出力を生成する別の簡単なスクリプトを記述し、 から実行します。find-exec必要ありませんxargs。例:

find . -maxdepth 1 -type f -wholename "$1" -exec /path/to/myscript.sh {} +

myscript.sh:

#!/bin/sh

for i in "$@"; do
  printf "<h2>Filename: %s</h2>\n<pre>" "$i"
  cat *
  printf "\n<pre>\n<br>Word Count %s\n" "$(wc -w "$i")"
done

これを保存し、 を実行して実行可能にしますchmod +x myscript.sh

見つかったファイルごとにを実行する (つまり、現在のディレクトリ内のすべてのファイルを cat する) 理由がわかりませんcat *が、それが要求されたことです。代わりに各ファイルの内容が必要ではないですか?cat "$i"の代わりにを使用してくださいcat *

あるいは、-exec sh -c ...代わりに以下を使用して、追加のスクリプトを使用せずに実行することもできます。

find . -maxdepth 1 -type f -wholename "$1" \
  -exec sh -c 'for i in "$@"; do
          printf "<h2>Filename: %s</h2>\n<pre>" "$i";
          cat "$i";
          printf "\n<pre>\n<br>Word Count %s\n" "$(wc -w "$i")";
        done' find-sh {} +

(読みやすさを向上させるために改行が追加されています。スクリプトは改行の有無にかかわらず同じように動作します。)

ちなみに、bash のみの機能を使用するスクリプトを実行する必要がある場合は、-exec bash -c ...の代わりにを使用します-exec sh -c ...

関連情報