Seu comando
$ find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh
tem o efeito de que, no máximo, quatro cópias do script de shell someFunction.sh
serão iniciadas ( -P 4
) em paralelo (novas serão geradas assim que as antigas forem concluídas), cada uma obtendo um nome de arquivo como seu argumento ( -n 1
).
Isso significa que cada chamada do seu script será parecida com
sh someFunction.sh segmentsomething
Dentro do script, o shell colocará os valores dos parâmetros posicionais (os argumentos na linha de comando) em $1
, $2
etc. ( $0
geralmente contém o nome do próprio script). No seu caso, $1
conterá o nome do arquivo e os outros estarão vazios.
Então, no script:
filename="$1"
echo "$filename"
cat "$filename"
É isso. Agora, geralmente quando alguém usa find
para procurar por arquivos e passar seus nomes de arquivos para xargs
, há o problema com nomes de arquivos que as pessoas tendem a lembrar uns dos outros, e eu farei isso aqui também.
O utilitário find
passa nomes de arquivos separados por espaço em branco. Isso não é bom se você tiver nomes de arquivos com espaços, pois isso causaria problemas para xargs
invocar seu script com nomes próprios.
Portanto, é uma boa prática sempre usar -print0
com find
e -0
com xargs
, o que significa que os nomes dos arquivos, em vez de separados por espaços, são separados por nul
caracteres ( %code%
). Isso torna muito mais seguro.
Assim:
$ find . -name 'segment*' -print0 | xargs -0 -n1 -P4 sh someFunction.sh