Recebi algum comando abaixo e preciso usar os parâmetros passados dentro do meu xargs
comando para o meu echo
comando, 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 xargs
comando, 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 find
com -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 ...
.