파일 시스템 루프를 무시하는 후속 링크 찾기

파일 시스템 루프를 무시하는 후속 링크 찾기

/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)에는 두 파일이 동일한지 테스트하는 명령 -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별도의 마운트가 있을 수 있으므로 트리밍이 필요하지 않습니다 .

관련 정보