Há uma parte que você pode melhorar facilmente, mas não é a parte mais lenta.
find /home/mydir/ -type f | sort | \ awk "/xml_20140207_000016.zip/,/xml_20140207_235938.zip/"
Isso é um pouco desnecessário, pois primeiro lista todos os arquivos, depois classifica os nomes dos arquivos e extrai os mais interessantes. O comando find
deve ser executado até a conclusão antes que a classificação possa começar.
Seria mais rápido listar apenas os arquivos interessantes em primeiro lugar, ou pelo menos um superconjunto tão pequeno quanto possível. Se você precisar de um filtro mais refinado em nomes do que o find
é capaz, canalize para o awk, mas não classifique: o awk e outros filtros linha por linha podem processar linhas uma por uma, mas o tipo precisa da entrada completa.
find /home/mydir/ -name 'xml_20140207_??????.zip' -type f | \
awk 'match($0, /_[0-9]*.zip$/) &&
(time = substr($0, RSTART+1, RLENGTH-5)) &&
time >= 16 && time <= 235938' |
xargs -n 1 -P 10 zipgrep "my search string"
A parte que é mais obviamente sub-ótima é zipgrep. Aqui não há uma maneira fácil de melhorar o desempenho devido às limitações da programação da shell. O script zipgrep opera listando os nomes dos arquivos no arquivo e chamando grep
no conteúdo de cada arquivo, um por um. Isso significa que o arquivo zip é analisado novamente para cada arquivo. Um programa em Java (ou Perl, ou Python, ou Ruby, etc.) pode evitar isso processando o arquivo apenas uma vez.
Se você quiser manter a programação shell, pode tentar montar cada zip em vez de usar o zipgrep.
… | xargs -n1 -P2 sh -c '
mkdir "mnt$$-$1";
fuse-zip "$1" "mnt$$-$1";
grep -R "$0" "mnt$$-$1"
fusermount -u "mnt$$-$1"
' "my search string"
Note que o paralelismo não vai te ajudar muito: o fator limitante na maioria das configurações será a largura de banda de E / S de disco, não o tempo de CPU.
Eu não fiz o comparativo de nada, mas acho que o melhor lugar para melhorar seria usar uma implementação do zipgrep em uma linguagem mais poderosa.