Uma pesquisa com locate
encontra caminhos no sistema de arquivos.
Muitas vezes, você sabe a priori que está interessado apenas em arquivos ou somente em diretórios.
Uma pesquisa 'localizar' geralmente retorna muitos resultados. Seria útil incluir apenas um dos tipos no resultado, pois ajuda a diminuir a saída.
Mas há um argumento mais interessante para excluir arquivos ou diretórios: porque a lista de caminhos de resultados pode ser ambígua - não apenas na teoria.
O exemplo abaixo é um caso do mundo real, e não incomum:
$ locate --regex --basename "xfce4-keyboard-overlay$"
/usr/local/bin/xfce4-keyboard-overlay
/usr/local/share/xfce4-keyboard-overlay
Ok, encontramos algo! Mas ... arquivos ou diretórios?
$ file /usr/local/bin/xfce4-keyboard-overlay
/usr/local/bin/xfce4-keyboard-overlay: bash script
Então esse é um arquivo ...
$ file /usr/local/share/xfce4-keyboard-overlay
/usr/local/share/xfce4-keyboard-overlay: directory
enquanto o segundo não é.
Essa ambiguidade está dificultando a leitura de longas listas de caminhos; portanto, seria muito bom filtrar diretórios, por exemplo, usando uma opção de linha de comman para locate
.
Será que algo assim existe? Mesmo se o filtro para diretórios estiver separado da localização?
Pelo menos, pode-se usar um script para iterar todos os nomes de arquivos a serem verificados - o que pode ser lento.
while
declaração?printf
para dados arbitrários .locate
seu,read
conforme sugerido aqui transnum.blogspot.ie/2008/11/…fonte
/usr/local/share/xfce4-keyboard-overlay
e todos os subdiretórios , no seu exemplo. Adicionando-maxdepth 0
ajuda.locate --regex --basename "xfce4-keyboard-overlay$" | xargs -I % sh -c "test -d % && echo %"
xargs
comfind
foi uma boa ideia, editei para torná-lo robusto. Espero que você não se importe.xargs
repetirá o comando para cada linha se você especificar-L 1
ou-i
parâmetro.Veja aqui
É certo que ele oferece um novo shell para cada arquivo, mas tem o benefício de ser agradável e compacto.
Edição: Eu não estava muito feliz com essa resposta porque estava chutando um novo shell para cada arquivo. Isso deve ter apenas dois processos:
Claro que seria bom se pudéssemos evitar o chute de um intérprete por completo, mas
xargs
parece estar comprometido em sua capacidade de encadear comandos.fonte
/home/evil/$(reboot)/xfce4-keyboard-overlay
e eu tolamente o executei comoroot
).Meus dois centavos:
É mais ou menos assim que o G-Man fez isso, combinado com a substituição do processo.
fonte
E se você combinar
locate
comfile
egrep
? ...fonte
file
para cada caminho. Observe que muitas vezes existem muitas linhas de resultados para localização. Meu teste atual está procurando por "gnome", fornecendo cerca de 73000 caminhos para testar.$f
arquivo que é um arquivo, ofile
programa abrirá esse arquivo e o lerá . Isso é extremamente caro quando tudo que você precisa fazer é astat()
. ………… Além disso, isso fornecerá resultados incorretos para arquivos que contenham "diretório" em seus nomes (como "diretório_de_elefone"). …………… (Além disso, afor f in `…`; do …
sintaxe não pode lidar com nomes que contenham espaços.)