Como executar um script em vários arquivos usando find?

Como executar um script em vários arquivos usando find?

Basicamente, preciso encontrar vários arquivos .csv e usar meu script que escrevi em todos eles. Eu tenho

find . -type f -name "*.csv" | xargs ./extractdata

isso funciona, mas faz apenas um arquivo e não todos os arquivos que preciso. Ajuda?

Responder1

A razão pela qual não funcionou é que ele xargsirá amontoar tantos arquivos quanto possível em uma linha de comando.

Portanto, o seu script "extractdata" receberá todos os arquivos de uma vez e provavelmente processará apenas o primeiro argumento. Ou seja, você tem N arquivos, você executaumroteiro comtodosos arquivos como argumento.

Você precisa usar o -nargumento:

... | xargs -n 1 ./extractdata

Desta forma você tem N arquivos, você executa N scripts comumargumento de arquivo cada.

No entanto, isso é quase exatamente a mesma coisa que executar findcom a -execopção (uma das diferenças é que você processa o arquivo na ordem encontrada, enquanto com a tubulação você pode, por exemplo, fazer isso depois de passar com sorte/ou grep):

find ... -exec /path/to/extractdata \{\} \;

Você também pode executar seu script em paralelo usando parallel: isso executa quatro instâncias por vez,possivelmentelevando a um processamento mais eficiente dependendo dos dados, RAM e hardware:

... | parallel -n 1 -j 4 ./extractdata

(Se "extractdata" usar arquivos temporários com nomes fixos, o que não é uma boa prática, então dois ou mais scripts executados em paralelo escreverão nos arquivos temporários um do outro, bagunçando tudo).

Responder2

Outra opção é a fdferramenta:

fd csv -x ./extractdata

https://github.com/sharkdp/fd

Responder3

Existem muitas maneiras de resolver isso, por exemplo, você poderia pedir findpara chamar o script, assim:

 $ find . -type f -name "*.csv" -exec your_script {} ;

{} é o nome do arquivo encontrado todas as vezes.

Talvez você precise escapar desses caracteres:

 $ find . -type f -name "*.csv" -exec your_script \{\} \;

informação relacionada