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