需要有關 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 ....

相關內容