查找忽略文件系统循环的后续链接

查找忽略文件系统循环的后续链接

当我尝试查找链接到 /tmp 文件夹的所有文件/目录时,我尝试

ls -di /tmp 

4194305这给了我索引节点/tmp

现在我会找到链接到该索引节点的所有文件

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 遵循符号链接。这很少是一个好主意。

相反,继续对符号链接进行操作,并过滤您想要的链接。

您正在按文件的索引节点号过滤文件,但这看起来像是一个错误:看起来您正在寻找与 相同的文件/tmp,而不是与 具有相同索引节点号的文件/tmp。您的命令还会查找具有相同索引节点/tmp但位于不同文件系统上的文件。

许多 shell(ksh、bash、zsh、dash)都有一个命令-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。使用-xdev,您还可以阻止find从一个文件系统移动到另一个文件系统,但由于符号链接可以跨文件系统,因此您需要在命令行上单独列出所有文件系统。也就是说,类似

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

/假设您除了、/home和之外没有其他文件系统/tmp。这也应该消除修剪的需要/media,因为那里的东西可能是单独的安装座。

相关内容