Como encontrar apenas arquivos executáveis usando 'locate'?

6

locate gtags encontraria todos os arquivos com o nome gtags .

E se eu precisar apenas de executáveis, existe alguma maneira de fazer isso?

    
por Jichao 30.03.2015 / 18:46

3 respostas

6

Não é fácil. Você pode usar

locate bash | while IFS= read -r line; do [[ -x "$line" ]] && echo $line; done

para encontrar todos os executáveis onde o nome contém bash . Isso é mais rápido do que usar find em todo o sistema de arquivos porque apenas alguns arquivos precisam ser verificados.

  • locate bash faz o que sempre faz (lista todas as correspondências)
  • | (pipe) pega a saída do primeiro comando ( locate ) e envia para o segundo (o resto da linha)
  • o loop while ...; do ... done itera sobre cada linha que recebe do pipe (de locate )
  • read -r line lê uma linha de entrada e a armazena em uma variável chamada line (no nosso caso, um caminho / nome de arquivo)
  • [[ -x "$line" ]] testa se o arquivo em $line é executável
  • se for, a parte && echo $line imprime na sua tela
por 30.03.2015 / 18:59
4

A solução mais rápida e mais barata:

locate -b '\gtags' | xargs -ri find {} -prune -type f -executable

De acordo com a página xargs man, a sintaxe acima passa todos os nomes de arquivos encontrados por locate para uma única execução de find , que examina apenas os arquivos especificados.

Esta solução é melhor que a dada anteriormente porque:

  • Usar find para pesquisar todos os arquivos no sistema que iniciam com o diretório raiz pode ser um comando curto, mas pode levar muito tempo para ser executado.
  • O uso de um loop while de shell para verificar cada nome de arquivo pode ser lento, pois ele verifica cada arquivo um de cada vez.

Já que outros pediram explicações detalhadas dos parâmetros dados em respostas anteriores, os detalhes são:

  • locate (Consulte: Invocando o locate - Localizando arquivos )
    • -b : Corresponda apenas o nome do arquivo base do nome do caminho com os padrões especificados, não considere os nomes dos diretórios no nome do caminho.
    • \ : Como a barra invertida é um caractere de globbing, impede que locate trate o padrão, gtags , como se fosse *gtags* . Ou seja, procura por arquivos que tenham o nome exato "gtags" sem outros caracteres antes ou depois.
  • xargs (Veja: opções xargs - Localizando arquivos )
    • -r : Se a entrada padrão estiver completamente vazia, não execute o comando.
    • -i : Substitua {} no seguinte comando pela lista de nomes de arquivos lidos a partir da entrada padrão.
  • find (Consulte: encontre o índice principal - Localizando arquivos )
    • {} : xargs substitui isso pelos nomes de todos os arquivos que recebe de locate na entrada padrão. find pesquisa todos esses arquivos em busca de correspondências para as seguintes expressões e, se algum deles for um diretório, ele também examinará o conteúdo deles.
    • -prune : Se um nome de arquivo sendo avaliado pertencer a um diretório, não pesquise seu conteúdo.
    • -type f : Incluir na saída somente nomes de arquivos que pertencem a arquivos "regulares", não especiais, como dispositivos, pipes nomeados, etc.
    • -executable : inclua na saída apenas nomes de arquivos executáveis. Ou seja, aqueles com um ou mais dos seus bits de modo executável definidos, independentemente do conteúdo do arquivo.

Em suma, locate imprime os nomes dos arquivos correspondentes na saída padrão, que é canalizada (usando | ) para a entrada padrão de xargs . xargs lê os nomes de arquivos da entrada padrão e os combina em uma lista delimitada por espaço em uma única cadeia de caracteres. Se a string não estiver vazia, xargs substitui a string por {} no comando find antes de executá-la.

    
por 03.05.2016 / 17:49
2

resposta curta, use o GNU find:

find / -type f -executable -name '*gtags*'
    
por 30.03.2015 / 18:56

Tags