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 xargs
irá 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 -n
argumento:
... | 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 find
com a -exec
opçã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 sort
e/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
Responder3
Existem muitas maneiras de resolver isso, por exemplo, você poderia pedir find
para 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 \{\} \;