У меня есть команда ниже, и мне нужно использовать параметры, переданные внутри моей 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 ...
.