ファイルシステムループを無視するフォローアップリンクの検索

ファイルシステムループを無視するフォローアップリンクの検索

/tmpフォルダにリンクされているすべてのファイル/ディレクトリを検索しようとしたとき

ls -di /tmp 

4194305これは私にインデックスノードを提供します/tmp

次に、そのinodeにリンクされているすべてのファイルを見つけます。

find / -follow -path /media -prune -inum $(ls -di /tmp |cut -d" " -f1)

ただし、これにより、数千のファイルシステムループ検出警告が表示されます。

find: File system loop detected; `/sys/devices/platform/reg-dummy

/subsystem/devices/serial8250/tty/ttyS2/subsystem/ttyS0/device/firmware_node/subsystem/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1/subsystem/event2/device/device/driver/PNP0C0C:00' is part of the same file system loop as `/sys/devices/platform/reg-dummy/subsystem/devices/serial8250/tty/ttyS2/subsystem/ttyS0/device/firmware_node/subsystem/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00'.
find: File system loop detected; `/sys/devices/platform/reg-dummy/subsystem/devices/serial8250/tty/ttyS2/subsystem/ttyS0/device/firmware_node/subsystem/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1/subsystem/event2/device/device/driver/LNXPWRBN:00' is part of the same file system loop as `/sys/devices/platform/reg-dummy/subsystem/devices/serial8250/tty/ttyS2/subsystem/ttyS0/device/firmware_node/subsystem/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1/subsystem/event2/device/device'.
find: File system loop detected; `/sys/devices/platform/reg-dummy/subsystem/devices/serial8250/tty/ttyS2/subsystem/ttyS0/device/firmware_node/subsystem/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1/subsystem/event2/device/device/input/input2' is part of the same file system loop as `/sys/devices/platform/reg-dummy/subsystem/devices/serial8250/tty/ttyS2/subsystem/ttyS0/device/firmware_node/subsystem/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1/subsystem/event2/device'.
find: File system loop detected; `/sys/devices/platform/reg-dummy/subsystem/devices/serial8250/tty/ttyS2/subsystem/ttyS0/device/firmware_node/subsystem/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1/subsystem/event2/device/event2' is part of the same file system loop as `/sys/devices/platform/reg-dummy/subsystem/devices/serial8250/tty/ttyS2/subsystem/ttyS0/device/firmware_node/subsystem/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1/subsystem/event2'.
find: File system loop detected; `/sys/devices/platform/reg-dummy/subsystem/devices/serial8250/tty/ttyS2/subsystem/ttyS0/device/firmware_node/subsystem/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1/device' is part of the same file system loop as `/sys/devices/platform/reg-dummy/subsystem/devices/serial8250/tty/ttyS2/subsystem/ttyS0/device/firmware_node/subsystem/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00'.
find: File system loop detected; `/sys/devices/platform/reg-dummy/subsystem/devices/serial8250/tty/ttyS2/subsystem/ttyS0/device/firmware_node/subsystem/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1/event1/subsystem/mice/subsystem' is part of the same file system loop as `/sys/devices/platform/reg-dummy/subsystem/devices/serial8250/tty/ttyS2/subsystem/ttyS0/device/firmware_node/subsystem/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1/event1/subsystem'.

これらのエラーをどのように無視できますか?

答え1

問題の原因は、findにシンボリックリンクに従うように指示したことです。これは良い考えではありません。

代わりに、シンボリックリンクを続けて目的のリンクをフィルタリングしてください。

/tmpinode番号でファイルをフィルタリングしているのにバグのようです。 inode numberが同じファイルを見つけるのではなく、inode numberが同じファイルを探しているようです/tmp。また、コマンドは/tmpinodeは同じですが、ファイルシステムが異なるファイルを探します。

多くのシェル(ksh、bash、zsh、dash)には、2つのファイルが同じかどうかをテストするコマンド-ef演算子test(スペルとも呼ばれます)があります。[ … ]

find / -path /media -prune -o -type l -exec ksh -c 'for x; do [ "$0" -ef "$x" ] && printf %s\\n "$x"; done' /tmp {} +

または、zshでこれを行うこともできます。

print -lr -- /^media/**/*(@e\''[[ $REPLY -ef /tmp ]]'\')

答え2

非物理ファイルシステム(例:/ proc、/ sysなど)を使用しないでください。また、これがfindあなたが望むものであると確信していますか?

このクエリを除外したいと仮定していますが、/mediaこれには次のOR-o)が必要です。

find / -follow -path /media -prune -o \( -inum $(ls -di /tmp |cut -d" " -f1) \)

また、質問によると、/tmpディレクトリ自体へのシンボリックリンクのみが必要です(その中のファイルへのリンクは必要ありません)。この場合、次のコマンドを実行します。

find / -path /media -prune -o -path /sys -prune -o -path /proc -prune -o \
  -path /dev -prune -o \( -follow -inum $(ls -di /tmp |cut -d" " -f1) -print \) \
  2> /dev/null

(位置-followも重要なので参考にしてください)

答え3

これらのループはsysfs擬似ファイルシステムカーネルのデータ構造とデバイスを表示します。一般的なファイルを探している場合は、おそらくこの問題(または/procその問題)に縛られたくありません。

サブツリーへのリンクが含まれる可能性が低いため、検索からサブツリーを-prune削除する/sysのと同じように使用できます。を使用すると、あるファイルシステムから別のファイルシステムに移動するのを防ぐことができますが、シンボリックリンクはファイルシステムにまたがる可能性があるため、コマンドラインからすべてのファイルシステムを個別に一覧表示する必要があります。つまり、次のようなものです。/media/tmp-xdevfind

find -L / /home /tmp -xdev -inum $inodenum

//homeを除く他のファイルシステムがないとします/tmp。また、/media別々のマウントがある可能性があるため、トリミングは不要です。

関連情報