Precisa de ajuda com xargs e substituição

Precisa de ajuda com xargs e substituição

Recebi algum comando abaixo e preciso usar os parâmetros passados ​​​​dentro do meu xargscomando para o meu echocomando, mas não consigo acertar? Se eu tentar:

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 {})";

Como você pode ver, o wc -w {}que não funcionaria dentro do meu xargscomando, ele o trata como literal. E se eu tentar:

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 ${})";

Isso me dá ${}uma mensagem de erro... Sei que provavelmente é por causa da análise, mas não tenho ideia de como consertar, alguém pode me ajudar?

Responder1

Escreva outro script simples para produzir a saída desejada e execute-o findcom -exec, sem necessidade de xargs. Por exemplo:

find . -maxdepth 1 -type f -wholename "$1" -exec /path/to/myscript.sh {} +

meuscript.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

Salve isso e torne-o executável, executando chmod +x myscript.sh.

Não sei por que você deseja executar cat *(ou seja, cat todos os arquivos no diretório atual) para cada arquivo encontrado, mas foi isso que você pediu. Tem certeza de que não deseja o conteúdo de cada arquivo? Use cat "$i"em vez de cat *.

Alternativamente, você pode fazer isso sem um script extra usando -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 {} +

(novas linhas extras adicionadas para melhorar a legibilidade. O script funciona da mesma forma com ou sem elas.)

A propósito, se você precisar executar um script que use recursos somente do bash, use -exec bash -c ...em vez de -exec sh -c ....

informação relacionada