Comando find do Linux - show progress

24

Eu queria saber se há alguma maneira de exibir algum tipo de informação de progresso ao procurar arquivos no Linux usando find. Costumo encontrar arquivos em um disco grande e algum tipo de indicador de progresso seria muito útil, como uma barra ou, pelo menos, o diretório atual "localizar" pesquisa. Existem scripts que fazem isso ou findsuportam alguns ganchos ?

Vlad Balmos
fonte
obrigado pelas respostas, vou verificar todas as soluções e decidi qual é a melhor. Se dependesse de mim, marcaria todas as respostas como aceitas.
Vlad Balmos
dependendo de qual critério Youb estão usando localizar é muito mais rápido do que achado
B14D3

Respostas:

28

com esse truque, você pode ver a pasta atual - mas nenhuma barra de progresso - desculpe.

 watch readlink -f /proc/$(pidof find)/cwd
ThorstenS
fonte
isso é legal. Deve-se notar que você precisa de privilégios de superusuário para acessar o cwd. obrigado!
Vlad Balmos
Funciona perfeitamente.
precisa
8

Um pequeno utilitário chamado pv (pipe viewer) pode ajudar. Do fantástico resumo de Peteris Krumins:

O visualizador de tubos é uma ferramenta baseada em terminal para monitorar o progresso dos dados através de um pipeline.

Você pode usar o pv de várias maneiras. Ao jogar por aqui, eu o coloco imediatamente após um pipe para monitorar o progresso da saída gerada pelo find (deve passar stdin para stdout intocado)

find / -mtime -1h | pv > /dev/null

que mostrará a saída um pouco assim:

6.42MB 0:01:25 [31.7kB/s] [         <=>      ]

(Eu redirecionei o stdout para / dev / null para que eu pudesse ver a barra de progresso em ação sem a saída voando. Essa provavelmente não é sua intenção com find, portanto, adapte-a de acordo)

Sinceramente, não tenho certeza de como isso funciona na natureza. Para achados "caros" como o descrito acima (atravessando a raiz), parecia funcionar razoavelmente bem. Para comandos mais simples em um nó mais profundo da árvore de diretórios, o pv falhou miseravelmente. Esses comandos estão retornando resultados imediatamente, portanto, uma barra de progresso provavelmente é discutida aqui.

De qualquer forma, brinque e veja se isso funciona para o que você precisa. Alimento para reflexão, pelo menos.

tcdyl
fonte
O que essa barra de progresso mostraria? Nem find, nem pvsei quanto tempo a busca vai demorar ,, de modo que não pode calcular a porcentagem. Tudo o que podemos ver na pvsaída é o tempo desde que a pesquisa foi iniciada.
Minaev
Isto está correto. Eu pensava que havia alguma mágica acontecendo em algum lugar que permitia ao pv verificar o progresso da passagem do diretório (o que está incorreto). Dada a entrada padrão a uma taxa constante, o pv simplesmente move a barra de progresso a uma frequência constante. Tente yes | pv > /dev/nullobservar
tcdyl
1
+1 para um bom utilitário
Vlad Balmos
Julgar o progresso não é trivial. Nem mesmo os navegadores da web que carregam páginas são capazes de fazer isso. Eu acho que, para o conteúdo do arquivo, você pode dividir pelo tamanho do arquivo, mas para os fluxos do Unix, você geralmente não sabe a quantidade total de dados, e essa ferramenta deve ser flexível para qualquer tipo de dados de fluxo, não apenas para arquivos.
Sridhar Sarnobat
7

Eu pesquisei isso hoje e cheguei aqui via Google. Eu tive uma descoberta de longa duração em execução no OS X e, aparentemente, watchnão existe lá. Então, aqui está outra solução:

lsof -Fn -a -c find -d cwd +r 10

  • lsof = lista de arquivos abertos
  • -Fn= apenas mostre o nome do arquivo / diretório (prefixado com o caractere 'n', pule se preferir a lsofsaída completa
  • -a= diga lsofpara mostrar apenas as linhas que correspondem a todos os critérios (por padrão, mostra linhas que correspondem a qualquer critério)
  • -c find= mostre arquivos / diretórios abertos pelo processo nomeado find(na verdade, processo cujo nome começa com find, mas diferencia maiúsculas de minúsculas, portanto Findernão será exibido)
  • -d cwd = mostra linhas com o FD (filedescriptor) cwd (diretório de trabalho atual)
  • +r 10 = mostra a saída a cada 10 segundos até que nenhum arquivo aberto seja encontrado (a localização está concluída)

Isso mostrará que o diretório findestá sendo processado a cada 10 segundos; portanto, deve dar uma idéia se findainda está funcionando e até que ponto progrediu.

Marie Fischer
fonte
5

Há um exemplo de pesquisas paralelas com find in man find. Utilizando-o, você pode executar várias verificações para cada item, executando várias ações, dependendo de qual condição funciona. A primeira verificação pode ser, por exemplo, simples -print, para que todos os nomes sejam impressos em stdout. A segunda verificação fará o que você deseja. Algo como:

find /work \( -fprint /dev/stderr \) , \( -name 'core' -exec rm {} \; \)

Se a segunda verificação também exibir nomes de arquivos, você poderá redirecionar um deles para o stderr usando -fprint /dev/stderr.

minaev
fonte
Eu não testei isso, mas acho que é o caminho certo.
Rolf
2

AFAIK, não, e sua implementação não seria trivial.

... Hmm. Talvez um script seja executado find <target dir> -type dprimeiro, armazenando a lista e ecoando cada dir antes de executar umfind <list item> -maxdepth 1 <rest of find parameters> loop for.

Observe que você está negociando uma / significativa / perda de desempenho em troca de poder ver vagamente o que está fazendo.

Shadur
fonte
1

Esta é uma lista dos arquivos atuais abertos pelo find , portanto é o mesmo que o find está procurando 'no momento'.

É leve como apenas o endereço de consulta dos descritores de arquivo usados ​​por find a cada segundo e não interfere na localização . Além disso, você pode fazer isso com qualquer programa que desejar.

# watch -n 1 'ls -l /proc/$(pidof find)/fd | cut -d ">" -f 2 | grep -v /dev/'

A grep -v /dev/é para ocultar arquivos STDOUT, STDIN e STDERR, que são arquivos usados para receber e imprimir dados em seu console.

Gabriel Saraiva
fonte