Encontre rapidamente todos os arquivos que começam com uma determinada string

2

Estou escrevendo um comando para encontrar links simbólicos do Cygwin quebrados.

Agora, estou usando:

egrep -rnw . -e "^\!<symlink>"

Mas isso não é muito eficiente. Eu só me importo se o arquivo começar com !<symlink> , mas grep continuará pesquisando o resto do arquivo.

Existe alguma maneira de pesquisar arquivos com eficiência por prefixo de conteúdo?

    
por PythonNut 03.09.2015 / 05:09

3 respostas

3

Com base na outra resposta e no comentário,

find . -type f -exec awk '/^!<symlink>/ {print FILENAME} {nextfile}' {} +

Como ele usa -exec … + , ele executará awk o menor número de vezes possível (baseado no tamanho máximo da lista de argumentos). Se awk encontrar uma linha que corresponda à expressão regular (isto é, a string de pesquisa), ele imprimirá o nome do arquivo. (Você não precisa da barra invertida ( \ ) se colocar a string entre aspas simples.) Obviamente, se você também quiser ver o conteúdo da linha, você pode dizer

{print FILENAME; print}

ou

{print FILENAME ": " $0}

E então, incondicionalmente, avança para o próximo arquivo; por isso, efetivamente, apenas a primeira linha de cada arquivo. Nota: nextfile não parece ser definido por POSIX ; provavelmente é apenas no GNU awk .

    
por 03.09.2015 / 06:38
2

Que tal:

find . -type f -exec head -1v {} + | egrep -B 2 -nw -e "^\!<symlink>"
    
por 03.09.2015 / 05:34
0

Também construindo outras ideias.

Já pensou em xargs ? Pode fazer alguma paralelização.

find . -type f -print0 | xargs -0 -P4 head -1 | egrep -wn "^\!<symlink>"

O que ele faz: procura por todos os arquivos regulares e separa a lista de arquivos com '\ 0' em vez de espaço em branco.
Instruímos o xargs para entender que '\ 0' é o separador e para executar 4 processos concorrentes (ajuste isso ao seu número de núcleos e velocidade do disco). Xargs irá executar o comando head em cada arquivo. Finalmente, aplicando os resultados ao seu padrão.

A cabeça ainda terá muito tempo. Mas ao mesmo tempo! A menos que você precise fazer pesquisas periódicas desse tipo, eu não me incomodaria em tentar otimizá-lo ainda mais. O tempo que leva para otimizar mais não será obtido com o tempo de execução mais rápido, se você executá-lo apenas uma vez, de qualquer maneira.

    
por 03.09.2015 / 10:33

Tags