![查找忽略文件系统循环的后续链接](https://linux22.com/image/91902/%E6%9F%A5%E6%89%BE%E5%BF%BD%E7%95%A5%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%BE%AA%E7%8E%AF%E7%9A%84%E5%90%8E%E7%BB%AD%E9%93%BE%E6%8E%A5.png)
当我尝试查找链接到 /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
,因为那里的东西可能是单独的安装座。