Lidando com interrupção de script

4

Eu preciso fazer uma iteração entre arquivos de 120k e 500k. find lida bem com isso.

find $PWD -type f -path "fragments/*.pdbqt"

Por algum motivo, quero listar o mesmo conjunto de arquivos novamente, na mesma ordem. Eu não me importo se a lista é ordenada alfa-numericamente ou por fstat chamadas ou qualquer outra coisa. Usar sort não é uma opção porque precisa saber a saída find completa antes de prosseguir, tornando mais lenta a execução do script. Você sabe alguma maneira de conseguir isso?

Atualizar. Eu descrevi meu problema mal. Enquanto meu script está processando esse grande número de arquivos, uma interrupção de luz pode ocorrer e o no-break pode ficar inativo. Meu script deve continuar de onde parou. Como posso processar os arquivos restantes?

    
por Pedro Lacerda 19.09.2012 / 05:20

2 respostas

1

O comando find retorna arquivos na ordem dos diretórios. A ordem de diretório não é estável; em alguns sistemas de arquivos, se você adicionar ou remover um arquivo, isso pode afetar a ordem de outros arquivos no mesmo diretório.

Eu questiono sua afirmação de que o tipo não é uma opção. A menos que o processamento de cada arquivo seja extremamente rápido, construir a lista de arquivos é bem rápido. Salve-o em um arquivo para que ele possa ser reutilizado se o trabalho for interrompido.

Você precisa saber de onde parou e voltar de lá. Retomar a partir de uma lista de arquivos já gerada será mais fácil do que resumir algumas enumerações complexas no meio.

    
por 20.09.2012 / 02:49
2

Salve a saída de localização em um arquivo e faça com que o script use esse arquivo como a lista de arquivos a serem processados. Conforme o script conclui o processamento de um arquivo, ele deve gravar o nome do arquivo em outro arquivo. Se o script for interrompido, será simples excluir os arquivos já processados, por exemplo, com grep , quando o script é reiniciado. Exemplo:

touch files_already_processed
while IFS= read -r file
do
    # skip file if already processed
    grep -q -e "$file" files_already_processed && continue
    # process the file
    # processing code goes here
    echo "$file" >> files_already_processed
done <files_to_process
    
por 19.09.2012 / 06:35