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.