Listar arquivos e ignorar erros de permissão

0

Eu preciso fazer uma lista de arquivos maiores que 10G que será a entrada ignorefile para um backup duply. No entanto, tenho alguns arquivos que não tenho permissão para ler. Eu quero ignorar aqueles que serão tratados mais tarde e limpar a lista sem a mensagem 'Permission denied'.

Eu posso fazer a lista assim:

$ find data/ -size +10G
/data/bigfile1
find: '/data/badfile1': Permission denied
find: '/data/badfile2': Permission denied
/data/bigfile2

Depois, preciso remover as linhas que contêm as strings "Permissão negada" ou "localizar:". Não tenho certeza se a ordem da saída da lista é relevante, mas é o que estou vendo. Estou tentando várias opções, mas não consigo remover as linhas. Estou seguindo essa pergunta, parece semelhante, mas não entendo porque não funciona. link

Estou tentando maneiras, primeiro com o grep:

$ find data/ -size +10G | grep -v 'find:'
find: '/data/badfile1': Permission denied
/data/bigfile1
find: '/data/badfile2': Permission denied
/data/bigfile2

Também usando o awk:

$ find data/ -size +10G | awk '!/find:/'
find: '/data/badfile1': Permission denied
find: '/data/badfile2': Permission denied
/data/bigfile1
/data/bigfile2

Em qualquer caso, a seleção positiva funciona bem. Então eu não sei o que fazer.

    
por Edana 08.08.2017 / 18:16

1 resposta

0

Redirecionamento IO

O problema não está no seu script, mas é um recurso do redirecionamento do UNIX IO.

Considere o seguinte comando

find data/ -size +10G | grep -v 'find:'

apenas o fluxo stdout está sendo enviado para o comando canalizado grep , as mensagens de erro estão em um fluxo de saída separado, stderr .

Portanto, mesmo que você esteja vendo as mensagens de erro em sua sessão de terminal, devido ao fato de o terminal estar imprimindo stdout e stderr no console, seu comando grep não é recebendo essas linhas de saída. Isso ocorre devido a como o | redireciona a saída. O canal | conecta apenas stdout aostdin do próximo comando, então o stderr não entra no próximo comando.

A maioria dos utilitários *NIX funciona dessa maneira, enviando erros para o fluxo de saída stderr para que, em situações como as que você encontra, não haja necessidade de filtrar essas mensagens.

Teste

Para ver qual será o stdout exato do comando acima quando ele for passado para grep , faça o seguinte:

find data/ -size +10G > out.txt

Você ainda deve ver os erros no seu console, mas o fluxo de saída stdout terá ido para um novo arquivo, out.txt . Olhe lá e você não verá as linhas de mensagens de erro.

    
por 08.08.2017 / 18:32