localizar junto com encontrar

2

Eu quero pegar todos os arquivos do diretório atual e dar a eles "locate" para verificar se eles estão em outro lugar. Então eu comecei com

find -maxdepth 1 -type f -name "libd*" -exec locate {} ';'

Mas isso não funciona porque find retorna os nomes em um formato como "./libdrm.so" e locate não funciona com o ponto principal. Então eu pensei que o locate -b deveria ajudar:

find -maxdepth 1 -type f -name "libd*" -exec locate -b {} ';'

Infelizmente, localize -b ./libdrm.so não funciona, considero isso um bug. Então eu tentei com basename:

find -maxdepth 1 -type f -name "libd*" -exec locate \'basename {}\' ';'

Isso não funciona porque 'basename {}' é resolvido primeiro e o resultado é "-exec locate '{}' ';'".

Alguma ideia de como posso passar "locate 'basename {}'" para o exec?

    
por jms 17.09.2017 / 18:46

4 respostas

3

Como você só quer procurar por arquivos na pasta atual, você também pode usar

locate libd*

ou algo como o seguinte, mas não faz muito sentido.

ls libd* | xargs locate
locate $(ls libd*)

Se você quiser usar o find, também poderá usar * em vez de . , mas também citarei o {} .

find * -maxdepth 1 -name "libd*" -exec locate "{}" ';'

Por fim, se você quiser incluir arquivos de ponto, também conhecidos como arquivos ocultos com glob.

shopt -s dotglob
find * -maxdepth 1 -name "libd*" -exec locate "{}" ';'
shopt -u dotglob
    
por Thomas 17.09.2017 / 19:39
0

Eu gostaria de sugerir

find . -maxdepth 1 -name "libd*" -exec sh -c 'for f; do locate "${f##*/}"; done' sh {} +

ou

find . -maxdepth 1 -name "libd*" -printf '%f
find . -maxdepth 1 -name "libd*" -exec sh -c 'for f; do locate "${f##*/}"; done' sh {} +
' | while read -rd '' f; do locate "$f"; done
    
por steeldriver 17.09.2017 / 19:04
0

Isso funciona para mim:

find -maxdepth 1 -type f -name "libd*" | sed -r 's/^\.\///' | xargs locate

sed -r 's/^\.\///' : remove o ./ do comando find

    
por George Udosen 17.09.2017 / 19:24
0
find -maxdepth 1 -name "libd*" | sed 's^\./^^' | locate -

Esta solução com certeza não é elegante, mas funciona para mim - sed 's^\./^^' simplesmente exclui "./" do início de cada linha.

Se você quiser usar vários comandos em -exec , faça do seguinte modo:

find -maxdepth 1 -name "libd*" -exec bash -c 'basename $1 | locate -' {} \;
    
por dessert 17.09.2017 / 19:01