Manter apenas a primeira correspondência da saída de localização

3

Eu preciso de locate de uma biblioteca no meu sistema e espera-se que seu nome seja encontrado algumas vezes. Eu quero manter apenas a primeira ocorrência.

Até agora eu tentei alguns métodos para dividir strings por newlines, mas nenhum deles parece funcionar com a saída de locate .

Eu não estou usando find porque não sei onde o lib pode estar adiantado.

Qualquer outra maneira (melhor) de lidar com isso também é bem-vinda.

    
por tutuca 21.11.2013 / 20:17

2 respostas

3

Existem várias maneiras de filtrar a saída de locate .

Método 1 - seja explícito

Se você sabe que está procurando por uma versão específica da biblioteca, basta perguntar locate diretamente.

$ locate libstdc++-3-libc6.2-2-2.10.0.so
/usr/lib/libstdc++-3-libc6.2-2-2.10.0.so

Método # 2 - grep

Se você estiver procurando por bibliotecas glibc .so, use grep para localizar somente esses resultados em locate .

$ locate libstdc++ | grep ".so$"
/usr/lib/libstdc++-3-libc6.2-2-2.10.0.so
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/32/libstdc++.so

Método # 3 - somente retorna as 10 primeiras linhas do resultado

Se você estiver mais interessado em encontrar os primeiros resultados, use head para retornar apenas os primeiros. Você pode direcionar head para retornar diferentes números de resultados usando a opção -# (menor, mas não padrão, equivalente a -n # ):

Exemplo

$ locate glibc | head -8
/usr/lib64/glib-2.0/include/glibconfig.h
/usr/sbin/glibc_post_upgrade.i686
/usr/sbin/glibc_post_upgrade.x86_64
/usr/share/aclocal/glibc2.m4
/usr/share/aclocal/glibc21.m4
/usr/share/doc/glibc-2.12
/usr/share/doc/glibc-common-2.12
/usr/share/doc/glibc-2.12/BUGS

(note que ele retorna 8 linhas, que não é necessariamente o mesmo que caminhos de arquivo, pois caminhos de arquivo podem ser feitos de várias linhas, já que o caractere de nova linha é tão válido quanto qualquer outro em um nome de arquivo).

    
por 21.11.2013 / 20:33
3

Algumas implementações locate como RedHat mlocate ou GNU locate (as duas mais comuns em sistemas operacionais baseados em Linux) e a maioria dos BSD tem uma opção -l para isso:

locate -l1 mylib

Se não, você terá que supor que os nomes dos arquivos não contêm caracteres de nova linha e canalizar a saída de locate para head -n 1 (algumas implementações da opção locate support a -0 para delimitar os resultados com caracteres NUL em vez de novas linhas, mas esses também suportam -l ).

    
por 21.11.2013 / 22:17