Aplicar la function bash a cada file en la subcarpeta recursivamente

Estoy intentando escribir un script que aplicará una function bash para cada file en un directory recursivamente. Por ejemplo, si las tests directory tenían todos mis files y subdirectorys, la secuencia de commands

 find tests -type f -print0 | xargs -0 echo 

Funciona perfectamente. Ahora quiero poder aplicar una function bash en lugar de simplemente echo, así que se me ocurrió algo como esto:

 function fun() { echo $1 } export -f fun find tests -type f -print0 | xargs -0 bash -c 'fun "$@"' 

Sin embargo, esto solo da como resultado un solo file en las testings, donde antes daba salida a todos los files. Esperaría que estos dos ejecutaran el mismo no?

Hay dos maneras de resolver este problema: puede decirle a xargs que ejecute el command con solo un argumento a la vez usando -n1 o un bucle para todos los arguments dentro de su function fun :

 function fun() { echo $1 } export -f fun find tests -type f -print0 | xargs -n1 -0 bash -c 'fun "$@"' -- 

o

 function fun() { while [ -n "$1" ]; do echo $1; shift; done } export -f fun find tests -type f -print0 | xargs -0 bash -c 'fun "$@"' -- 

Use un script de shell

Para citar de esta excelente respuesta :

¿Es necesario que otros progtwigs además de tu caparazón puedan usarlo? Si es así, tiene que ser un script.

Como ya se señaló en otras respuestas, puede ser posible solucionar esto exportando la function, pero es mucho más simple usar un script.

 #!/bin/bash # I'm a script named "fun"! :) printf '%s\n' "$@" 

Luego, simplemente coloca la secuencia de commands fun en algún lugar de tu RUTA (quizás en ~/bin ), asegúrate de que sea ejecutable y de que puedas ejecutar:

 find tests -type f -exec fun {} + 

Si usa GNU Parallel, se ve así:

 function fun() { echo "$@" } export -f fun find tests -type f -print0 | parallel -0 -Xj1 fun