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 ...

おすすめ記事