어떤 패키지가 소유하지 않은 파일을 찾는 방법?


12

내 시스템에는 패키지에 속하지 않는 파일이 있습니다. 파일은 내 파일이거나로 설치된 컴파일 된 프로그램에서 가져옵니다 make install. 패키지에 속하지 않은 모든 파일을 어떻게 찾을 수 있습니까?

답변:


10

/var/lib/dpkg/info있는 .list텍스트 파일 목록의 모든 파일은 데비안의 패키지 관리자를 통해 설치된 각 package¹에 포함되어있다.

파일 시스템에서 모든 항목과 일치하지 않는 모든 파일을 찾으려면 다음과 같은 방법으로 얻을 수 있습니다.

find / -xdev -type f \( -exec grep -xq "{}" /var/lib/dpkg/info/*.list \; -or -print \)

전체 파일 시스템이 스캔되므로 시간이 오래 걸립니다. 시스템 디렉토리에 다른 파티션 (예 : /usr또는 /var)을 사용하는 경우 초기 뒤에 파티션을 지정하십시오 /.

경고 : 패키지 스크립트로 작성된 파일은 포함 되지 않습니다 . 예를 들어 :

  • /etc/hosts.allowlibwrap0패키지 설치시 해당 파일이 존재하지 않는 경우, 파일이 어디에도 나열되지 않았지만 파일이 생성 되었을 수 있습니다 .
  • 설치하는 동안 .pyc파일 (Python 라이브러리 컴파일), .elc파일 (Emacs Lisp 라이브러리 컴파일) 등 많은 파일이 컴파일됩니다 .

오류find: argument list too long
naught101

@ naught101 이것은 일치하는 gazillion 파일이 있음을 나타냅니다. /var/lib/dpkg/info/*.list위의 쿼리는 다른 원칙에 따라 다시 작성해야합니다.
파트리스 레베 스크

6

보다 효율적 버전 파트리스의 용액 @ 프로세스 교체 지원 (갖는 쉘을 사용하여 bash, AT & T ksh, zsh) :

(
  export LC_ALL=C
  comm -23 <(find / -xdev -type f | sort) \
           <(sort -u /var/lib/dpkg/info/*.list)
)

Patrice의 솔루션과 마찬가지로 파일 경로에 줄 바꿈 문자가 포함되어 있지 않다고 가정합니다.


1
locate데이터베이스를 사용하는 것이 실행하는 것보다 빠릅 find니까? locate \* | grep -v "^/home/"-또한 /boot/다른 시스템 파티션을 살펴볼 수 있다는 이점이 있습니다.
naught101

3

debian아직 언급하지 않은 명백한 선택으로 질문을 태그 했으므로 cruft-ng유연성이 필요 cruft하지 않거나 전체 시스템 / 위치를 검색하지 않으려는 경우 사용하는 것입니다.


0

프로세스 대체 & grep&를 사용할 수도 있습니다 find. (가) 있습니다 grep에서만 관련 경로를 필터링 두 번 사용 /var/lib/dpkg/info하면 특정 디렉토리에있는 파일을 찾는 경우에 몇 초 저장합니다.

dir="/lib/x86_64-linux-gnu"
find "$dir" -type f \
| grep -v -x -F -f \
    <(find '/var/lib/dpkg/info' -name '*.list' -print0 \
       | xargs -0 grep -h -F "^$dir" \
       | sort -u)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.