명령이 심볼릭 링크이기 때문에 "dpkg -S"가 경로를 찾을 수 없는 경우 명령이 설치된 패키지를 어떻게 찾을 수 있나요?

명령이 심볼릭 링크이기 때문에 "dpkg -S"가 경로를 찾을 수 없는 경우 명령이 설치된 패키지를 어떻게 찾을 수 있나요?

라벨 정보를 작성할 때, 내가 찾으려고 하는 패키지rename명령이 설치되었습니다. 나는 평소 dpkg -S대로 달렸다.이 문제):

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

나는 일반적으로 명령을 수동으로 설치하지 않고 /usr/bin액세스 권한이 있는 다른 컴퓨터에 rename설치합니다 . 첫 번째 의심은 이 명령이 일부 패키지의 설치 후 단계에서 복사되었다는 것입니다.

그런 다음 하나를 만들고 명령이 실제로 링크라는 ls -l /usr/bin/rename것을 알았습니다 . link target( ) 을 rename시도했지만 패키지 이름도 제공되지 않았습니다.dpkg -S/etc/alternatives/renamedpkg -S /etc/alternatives/rename

추가 검색 결과, 이 링크 체인의 실제 실행 가능 대상은 /usr/bin/prename다음과 같습니다.dpkg -S따르지 않는 심볼릭 링크 동작에 대한 버그 보고서. 보고서는 2003년에 작성된 것으로, 심볼릭 링크를 추적하는 옵션을 찾을 수 없으며 dpkg문제가 해결될 것 같지 않습니다.

명령이 심볼릭 링크인 경우 "실제" 실행 파일이 포함된 패키지를 어떻게 쉽게 찾을 수 있습니까?

답변1

readlink인쇄 링크를 사용하여 위치를 가리킬 수 있습니다 . 옵션이 없는 인수는 readlink링크여야 하며, 파일에 전달하면 아무 것도 인쇄되지 않습니다. -f링크를 재귀적으로 따라가는 coreutils 패키지의 옵션readlink그리고인수가 이미 파일인 경우에도 파일 이름이 인쇄됩니다.

이렇게 하면( -n출력 끝에 개행 문자가 표시되지 않음 readlink):

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

당신은 대답을 얻을 것입니다 :

perl: /usr/bin/prename

이 경우, 따라가는 링크가 명확하게 표시되지만 prename이것이 사실이라는 보장은 없습니다(예: 링크가 rename$PATH에 없는 디렉터리의 실행 파일을 가리키는 경우).

realpath@011c에서 알 수 있듯이 이미 설치되어 있는 경우 대안으로 사용할 수 있습니다.readlink -f

관련 정보