Como encontrar o pacote que instalou um comando, se “dpkg -S” não encontrar nenhum caminho porque o comando é um symlink?

1

Enquanto eu criava uma tag de informações para , tentei para procurar com qual pacote o comando rename foi instalado. Eu corri o usual dpkg -S (também mencionado em esta questão ):

$ which rename
/usr/bin/rename
$ dpkg -S $(!!)
dpkg-query: no path found matching pattern /usr/bin/rename

Eu normalmente não instalo comandos manualmente em /usr/bin , e nas outras máquinas que tenho acesso, rename também está instalado. Minha primeira suspeita foi que este comando foi copiado lá em algum passo pós-instalação de algum pacote.

Então eu fiz um ls -l /usr/bin/rename e descobri que o comando rename foi um link. Eu tentei dpkg -S no destino do link ( /etc/alternatives/rename ), mas dpkg -S /etc/alternatives/rename também não forneceu um nome de pacote.

Depois de algumas pesquisas, descobri que o verdadeiro alvo executável dessa cadeia de links é /usr/bin/prename e existe um relatório de bugs para o comportamento dpkg -S de não seguir links simbólicos . Esse relatório é de 2003 e não encontrei nenhuma opção para seguir links simbólicos para dpkg e esse problema não parece estar resolvido.

Como posso encontrar facilmente o pacote que contém o executável "real", caso o comando seja um link simbólico?

    
por Anthon 03.10.2014 / 07:59

1 resposta

3

Você pode usar readlink para imprimir para onde um link aponta. O argumento para readlink sem opções tem que ser um link, se você passar um arquivo, ele não irá imprimir nada. A opção -f para readlink , do pacote coreutils, segue recursivamente os links e imprime o nome do arquivo, mesmo que o argumento já seja um arquivo.

Se você fizer isso ( -n suprime a nova linha no final da saída readlink ):

dpkg -S "$(readlink -fn "$(which rename)")"

Você receberá a resposta:

perl: /usr/bin/prename

que um link foi seguido neste caso é claro do prename , mas isso não é garantido para ser o caso (por exemplo, se um link estava apontando para um executável rename em um diretório que não está em seu $ PATH).

Como @ 011c indicado, e se você tiver instalado, você pode usar realpath como alternativa para readlink -f

    
por 03.10.2014 / 07:59

Tags