Eu sugeriria passar a lista para xargs
e usar as opções -n
e / ou -P
para controlar quantos processos estão sendo executados a qualquer momento.
Estou tentando escrever um script de shell para converter muitos arquivos .wav para .mp3. Eu uso o comando "find" para encontrá-los, depois o comando "lame" para converter. Eu posso usar um loop for simples para isso, mas eu preciso fazer isso usando vários processos paralelos.
Eu quero ter um número definido de processos, por exemplo 4. Comece a converter um arquivo em cada processo. Quando um arquivo termina de converter em um processo, eu o substituo pelo próximo arquivo. Qual é a melhor maneira de abordar isso?
Eu sugeriria passar a lista para xargs
e usar as opções -n
e / ou -P
para controlar quantos processos estão sendo executados a qualquer momento.
make
pode ser bom para isso. Você precisará de um Makefile
com algo como
%.mp3: %.wav
lame $(LAMEOPTS) $< $@
Em seguida, gere uma lista de destinos:
$ find . -name '*.wav' -type f | sed -e 's/\(.*\.\)wav$/all: mp3/' >>Makefile
Agora, diga make
para agendar as tarefas:
$ make -r -j4 -f Makefile
Estou surpreso que ninguém tenha mencionado o GNU paralelo ainda. Usando-o, o comando seria tão simples quanto:
find -type f -name '*.wav' -print0 | parallel -0 lame {} {.}.mp3
Isso pede para substituir a extensão de cada arquivo de entrada por mp3
. Por padrão, o paralelismo executará tantos trabalhos quantos os processadores na máquina, mas você pode definir um valor diferente com -j <i>integer</i>
. O switch --dry-run pode ser útil para ver quais comandos seriam executados.
Se você tiver xjobs
instalado, verá que este é exatamente o tipo de tarefa para o qual foi projetado. Em particular, verifique a descrição da opção -j
para ajustar quantos processos são criados.
Tags shell shell-script parallelism