![Necesita ayuda con xargs y sustitución](https://rvso.com/image/191770/Necesita%20ayuda%20con%20xargs%20y%20sustituci%C3%B3n.png)
Recibí algún comando a continuación y necesito usar los parámetros pasados dentro de mi xargs
comando para mi echo
comando, 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 xargs
comando, 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
, -exec
sin 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 ...
.