Este comando irá imprimir arquivos de lsof
que precisam de truncamento.
(Na verdade, não remove nem trunca nenhum arquivo).
lsof
retornará uma lista de arquivos abertos (descritores de arquivos) que são canalizados para o awk, que os processa da seguinte forma.
gawk '~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", ,}'
A expressão acima contém duas expressões regulares separadas por um ponto-e-vírgula ;
vamos considerar a primeira parte gawk '~/txt/{next};
Aqui, se o quarto campo contiver txt
, a próxima linha de texto será lida, o que o script começará a processar desde o início novamente.
A instrução next
força o awk a parar imediatamente o processamento do registro atual e passa para o próximo registro. Isso significa que nenhuma outra regra é executada para o registro atual e o restante da ação da regra atual não é executada.
Agora vamos considerar a segunda parte do script /REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", ,}'
Aqui, se a linha corresponder à expressão regular /REG.*\(deleted\)$
(o $
significa que (deleted)
deve ser a última palavra na linha), apenas imprime >/proc/%s/fd/%d\n", ,
.
No comando lsof, é o número do descritor de arquivo (por exemplo,
53w
, o w
significa que o arquivador foi aberto para gravação) ou tipo de arquivo, dependendo do arquivo. O %d
no printf
garante que apenas os números serão impressos, removendo quaisquer caracteres de texto (como w
). imprime o id do processo do processo que usa o arquivo para imprimir algo como
>/proc/3989/fd/53
e assim por diante imprimirá todos os arquivos que foram apagados, mas cujo descritor de arquivo permanece aberto, em outras palavras, descritores de arquivo que podem ser truncado com segurança.