需要有关 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

编写另一个简单的脚本来生成您想要的输出,然后从findwith运行它-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 ....

相关内容