removendo pastas com find - mensagem estranha

4
mkdir foodir
find . -iname foodir -exec rm -fr {} \;

Ele faz o trabalho, mas mensagem de barfs:

find: './foodir': No such file or directory
    
por Marcus Junius Brutus 22.03.2013 / 10:38

4 respostas

6

A sequência exata de eventos seria algo como

  1. crie foodir
  2. inicie find
    1. find lê o diretório atual, armazena em cache o resultado e, em seguida, itera sobre ele, localizando uma entrada para foodir
    2. find inicia o comando exec para foodir, excluindo foodir
    3. find tenta reciclar em foodir (está no cache interno do find), que não existe mais
    4. find exibe um aviso de que não foi possível recorrer ao foodir
    5. o find continua com a próxima entrada (o que, nesse caso, provavelmente é o final da lista de entradas de diretório, portanto, sai depois de ter feito seu trabalho com o melhor de sua capacidade)

Então, o que você está vendo é perfeitamente explicável, ainda que inesperado do ponto de vista externo.

O cache é quase certamente feito para melhorar o desempenho, economizando um número potencialmente grande de chamadas do sistema, bem como um grande potencial de E / S de disco para cada arquivo. Sem um sistema de arquivos transacional, o que é comum, mas não garantido, não há garantia de que você não acertaria problemas como este, mesmo que o Find tenha lido o diretório uma vez para cada entrada; e no caso de sistemas de arquivos não-locais em particular, até mesmo a ordem das entradas pode mudar entre as verificações, portanto você não pode simplesmente acompanhar um índice, mas deve manter o controle de cada diretório entrada que você visitou. Para uma hierarquia de diretórios grande, isso se torna proibitivo muito rapidamente.

Em geral , isso é denominado " condição de corrida ": uma pré-condição para uma mudança de cálculo entre quando o cálculo é feito e quando o valor resultante é usado.

Olhando para a página man do GNU find, há uma opção -ignore_readdir_race que pode ajudar a suprimir o aviso. No entanto, eu não sei o quanto isso faz para quaisquer outros comandos executados através do find. Dependendo de suas necessidades, isso pode ser suficiente. Você também pode suprimir quaisquer erros e avisos encontrados ao redirecionar seu erro padrão para / dev / null (anexar 2>/dev/null à linha de comando), mas não é recomendável, pois pode ocultar erros mais sérios. Eu também não sei de imediato como isso iria interagir com qualquer saída de erro do comando invocado.

    
por 22.03.2013 / 10:53
1

find indica o diretório de destino conforme ele é iniciado para obter o conteúdo do diretório. Em seguida, ele processa os comandos que você forneceu, os quais, nesse caso, alteram o conteúdo do diretório removendo uma entrada. Portanto, a ideia de find do que o diretório contém e a realidade estão em desacordo, e emite a mensagem de aviso.

    
por 22.03.2013 / 10:50
0

Isso parece fazer sentido - seu comando encontra o foodir e o remove. Ordenação de comandos é o motivo da mensagem.

    
por 22.03.2013 / 10:47
0

Use este comando em vez disso

find . -iname foodir | xargs rm -Rf
    
por 29.10.2013 / 14:17

Tags