我在下面得到了一些命令,我需要使用命令内部传递的参数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
with运行它-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 ...
.