Necesita ayuda con xargs y sustitución

Necesita ayuda con xargs y sustitución

Recibí algún comando a continuación y necesito usar los parámetros pasados ​​dentro de mi xargscomando para mi echocomando, pero parece que no puedo hacerlo bien. Si lo intento:

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 puede ver, wc -w {}no funcionaría dentro de mi xargscomando, lo trata como un literal. Y si lo intento:

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

Me da ${}un mensaje de error... Sé que probablemente se debe al análisis, pero no tengo idea de cómo solucionarlo, ¿alguien puede ayudarme?

Respuesta1

Escriba otro script simple para producir el resultado que desea y ejecútelo desde find, -execsin necesidad de xargs. Por ejemplo:

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

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

Guarde esto y hágalo ejecutable ejecutando chmod +x myscript.sh.

No sé por qué querrías ejecutar cat *(es decir, cat todos los archivos en el directorio actual) para cada archivo encontrado, pero eso es lo que pediste. ¿Estás seguro de que no querías el contenido de cada archivo? Usar cat "$i"en lugar de cat *.

Alternativamente, puedes hacerlo sin un script adicional usando -exec sh -c ...en su lugar:

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 {} +

(Se agregaron nuevas líneas adicionales para mejorar la legibilidad. El script funciona igual con o sin ellas).

Por cierto, si necesita ejecutar un script que utilice funciones exclusivas de bash, utilice -exec bash -c ...en lugar de -exec sh -c ....

información relacionada