どのパッケージにも所有されていないファイルを見つける方法は?


12

私のシステムでは、どのパッケージにも属していないファイルがあります。それらは私のものであるか、またはでインストールされたコンパイル済みプログラムからのものmake installです。どのパッケージにも属していないすべてのファイルを見つけるにはどうすればよいですか?

回答:


10

/var/lib/dpkg/info.list、Debianのパッケージマネージャを通じてインストールされた各パッケージに含まれるすべてのファイルをリストしたテキストファイルがあります。

ファイルシステム内のどのエントリにも一致しないすべてのファイルを見つけるには、次のような単純な方法で実現できます。

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

ファイルシステム全体がスキャンされるため、これには明らかに非常に長い時間がかかります。システムディレクトリ(/usrまたはなど/var)に別のパーティションを使用する場合は、初期パーティションの後に指定します/

警告:パッケージスクリプトによって作成されたファイル含まれませ。例えば:

  • /etc/hosts.allowはどこにもリストさlibwrap0れていませんが、パッケージのインストール時にそのファイルが存在しなかった場合、作成された可能性があります。
  • インストール中に多くのファイルがコンパイルされます。たとえば、.pycファイル(コンパイルされたPythonライブラリ)、.elcファイル(コンパイルされたEmacs Lispライブラリ)などです。

エラーfind: argument list too long
naught101

@ naught101それは一致する膨大な数のファイルがあることを示唆しています/var/lib/dpkg/info/*.list—上記のクエリは他のいくつかの原則の下で書き直す必要があるでしょう。
Patrice Levesque

6

@Patriceのソリューションのより効率的なバージョンで、プロセス置換をサポートするシェルを使用します(bash、AT&T kshzsh):

(
  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

2

あなたが質問にタグを付けたのでdebian、まだ述べられていない明らかな選択で質問はcruft-ngあなたが柔軟性を必要としない場合、またはcruftシステム全体/ロケートされたbを検索したくない場合に使用することです。


0

また、プロセス置換&使用することができますgrep&をfind。特定のディレクトリでファイルを探している場合grep、関連するパスのみをフィルタリングするためにを2回使用し/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.