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 find
suportam alguns ganchos ?
24
Respostas:
com esse truque, você pode ver a pasta atual - mas nenhuma barra de progresso - desculpe.
fonte
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)
que mostrará a saída um pouco assim:
(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.
fonte
find
, nempv
sei quanto tempo a busca vai demorar ,, de modo que não pode calcular a porcentagem. Tudo o que podemos ver napv
saída é o tempo desde que a pesquisa foi iniciada.yes | pv > /dev/null
observarEu pesquisei isso hoje e cheguei aqui via Google. Eu tive uma descoberta de longa duração em execução no OS X e, aparentemente,
watch
nã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 alsof
saída completa-a
= digalsof
para 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 nomeadofind
(na verdade, processo cujo nome começa comfind
, mas diferencia maiúsculas de minúsculas, portantoFinder
nã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
find
está sendo processado a cada 10 segundos; portanto, deve dar uma idéia sefind
ainda está funcionando e até que ponto progrediu.fonte
Há um exemplo de pesquisas paralelas com
find
inman 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
.fonte
AFAIK, não, e sua implementação não seria trivial.
... Hmm. Talvez um script seja executado
find <target dir> -type d
primeiro, 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.
fonte
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.
A
grep -v /dev/
é para ocultar arquivos STDOUT, STDIN e STDERR, que são arquivos usados para receber e imprimir dados em seu console.fonte