com este truque você pode ver a pasta atual - mas sem barra de progresso - desculpe.
watch readlink -f /proc/$(pidof find)/cwd
Eu queria saber se há alguma maneira de exibir algum tipo de informação de progresso ao procurar por arquivos no linux usando find
. Eu sempre me encontro procurando 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" pesquisas. Há algum script que faça isso, ou find
apoiar alguns ganchos?
Um pequeno utilitário chamado pv (visualizador de canos) pode ajudar. Do resumo fantástico de Peteris Krumins:
O visualizador de tubulação é uma ferramenta baseada em terminal para monitorar o progresso dos dados por meio de um pipeline.
Você pode usar pv de várias maneiras. Ao jogar por aqui, eu 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 que a saída voasse. Essa provavelmente não é a sua intenção com o find, portanto adapte-a de acordo)
Eu honestamente não tenho certeza de como isso funciona na natureza. Para as descobertas "caras", como a acima (passando da raiz), ela parece funcionar razoavelmente bem. Para comandos mais simples em um nó mais profundo na árvore de diretórios, o pv falhou miseravelmente. Esses comandos estão retornando os resultados imediatamente, portanto, uma barra de progresso provavelmente está disponível aqui.
De qualquer forma, brinque e veja se isso funciona para o que você precisa. Alimento para o pensamento, pelo menos.
Eu procurei por isso hoje e cheguei aqui via Google. Eu tive uma longa descoberta executando 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 mostra o nome do arquivo / diretório (prefixado com o caractere 'n', pule isto se você preferir o lsof
output completo -a
= informar lsof
para mostrar apenas as linhas que correspondem aos critérios all (por padrão, ele mostra linhas correspondentes a qualquer critério) -c find
= mostrar arquivos / diretórios abertos pelo processo chamado find
(na verdade, processo cujo nome começa com find
, mas diferencia maiúsculas de minúsculas, então Finder
não será exibido) -d cwd
= mostra linhas com 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 (find is finished) Isso mostrará o diretório find
está processando a cada 10 segundos, portanto, ele deve dar uma ideia se find
ainda estiver funcionando e o quanto progrediu.
Há um exemplo de pesquisas paralelas com find
em man find
. Usando-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
, portanto, todos os nomes são impressos em stdout. A segunda verificação fará o que você quiser. 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 stderr usando -fprint /dev/stderr
.
AFAIK, isso não acontece e implementá-lo não seria trivial.
... Hmm. Talvez um script executando find <target dir> -type d
primeiro, armazenando a lista e ecoando cada diretório antes de executar um find <list item> -maxdepth 1 <rest of find parameters>
em um loop for.
Note que você está trocando uma / significativa / perda de desempenho em troca de poder ver vagamente o que está fazendo.
Esta é uma lista dos arquivos atuais abertos por find , então é o mesmo que encontrar está procurando "agora".
É leve como apenas o endereço de consulta dos descritores de arquivo usados por encontrar a cada segundo e não interfere em encontrar . 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/'
O grep -v /dev/
é para ocultar os arquivos STDOUT, STDIN e STDERR, que são arquivos usados para receber e imprimir dados no seu console.