![xargs と置換に関するヘルプが必要です](https://rvso.com/image/191770/xargs%20%E3%81%A8%E7%BD%AE%E6%8F%9B%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E3%83%98%E3%83%AB%E3%83%97%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%A7%E3%81%99.png)
以下のようなコマンドがあり、コマンド内で渡されたパラメータをコマンド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 ...
。