web-dev-qa-db-ja.com

どのパッケージにも所有されていないファイルを見つけるにはどうすればよいですか?

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

12
geaplanet

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

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

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

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

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

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

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

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

Patriceのソリューションと同様に、ファイルパスに改行文字が含まれていないことを前提としています。

6

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

3
stefanct

プロセス置換&grepfindを使用することもできます。 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)
0
Josef Kufner