Нужна помощь с 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 {}wouldnt работает внутри моей 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 all files in the current directory) для каждого найденного файла, но это то, о чем вы просили. Вы уверены, что вам не нужно содержимое каждого файла вместо этого? Используйте 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 ....

Связанный контент