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.