Verificando uma condição arbitrária baseada em conteúdo de arquivo com find

1

Eu gostaria de find e excluir todos os arquivos principais em uma grande árvore de diretórios.

Para fazer isso, eu gostaria de combinar arquivos que satisfaçam um determinado padrão de nome de arquivo, como:

find . -name 'core*'

... mas assim que esse arquivo é encontrado, eu também quero executar o comando file para ter certeza de que é realmente um dump principal, algo como:

file --brief --mime <filename> | grep -q 'application/x-coredump'

Se esse comando for bem-sucedido, eu gostaria de excluir o arquivo. Posso fazer tudo dentro de encontrar?

É importante que o comportamento seja "atalho": não quero executar file a menos que o comando corresponda ao padrão, pois isso seria muito lento.

    
por BeeOnRope 16.11.2017 / 23:23

2 respostas

3

find + bash abordagem:

find / -type f -name "*core*" -exec bash -c \
'[[ 'file -bi "$0"' =~ application/x-coredump ]] && echo rm "$0"' {} \;

Remova echo da chamada se você tiver convencido de nomes de arquivos "necessários" encontrados.

Ou ainda mais curto - com a ação find -delete :

 find / -type f -name "*core*" -exec bash -c \
'[[ 'file -bi "$0"' =~ application/x-coredump ]]' {} \; -delete
    
por 16.11.2017 / 23:57
2

Claro que é possível:

find . -name '*.core' -type f -exec \
    sh 'if file -bi "$1" | grep -qw ^application/x-coredump; then printf "%s\n" "$1"; fi' \
    sh {} \;

Se estiver satisfeito com o resultado, substitua printf "%s\n" por rm -f .

    
por 16.11.2017 / 23:45

Tags