Como resolver o erro "Broken Pipe" ao usar o awk com a cabeça

1

Estou recebendo erros de canais quebrados de um comando que faz algo como:

ls -tr1 /a/path | awk -F '\n' -vpath=/prepend/path/ '{print path$1}' | head -n 50

Essencialmente eu quero listar (com caminho absoluto) os arquivos X mais antigos em um diretório.

O que parece acontecer é que a saída está correta (recebo 50 caminhos de arquivo) mas quando head gera os 50 arquivos ele fecha stdin fazendo com que o awk jogue um erro de pipe quebrado, já que ele ainda gera mais linhas. / p>     

por Jon 28.11.2011 / 16:23

1 resposta

0

Solução do OP, revisão 2

Acontece que eu estava sendo muito burro.

Em primeiro lugar, não é necessário que o awk preencha o caminho para cada arquivo, apenas para jogar a maior parte dele fora. Portanto, a instrução awk deve ser o último canal.

Em segundo lugar, em vez de reverter a classificação com ls, podemos fazer uma classificação de tempo padrão e usar a cauda para extrair as linhas que buscamos. Isso garante que o tubo permaneça aberto durante todo o processo.

O novo comando seria parecido com:

ls -t1 /a/path | tail -n 50 | awk -F '\n' -vpath=/prepend/path/ '{print path$1}'
    
por 20.03.2017 / 11:04