私のシステムには、どのパッケージにも属していないファイルがあります。それらは私のものであるか、make install
でインストールされたコンパイル済みプログラムからのものです。どのパッケージにも属していないすべてのファイルを見つけるにはどうすればよいですか?
/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ライブラリ)など)など、多くのファイルがインストール中にコンパイルされます。プロセス置換をサポートするシェルを使用した @ Patriceのソリューション のより効率的なバージョン(bash
、AT&T ksh
、zsh
):
(
export LC_ALL=C
comm -23 <(find / -xdev -type f | sort) \
<(sort -u /var/lib/dpkg/info/*.list)
)
Patriceのソリューションと同様に、ファイルパスに改行文字が含まれていないことを前提としています。
質問にdebian
のタグを付けたので、まだ言及されていない明らかな選択は、柔軟性が必要ない場合はcruft-ng
を使用し、検索したくない場合はcruft
を使用することです。システム全体/ロケーションb。
プロセス置換&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)