localiza links seguidos ignorando loops do sistema de arquivos

4

Quando tento encontrar todos os arquivos / diretórios que ligam à pasta / tmp, tento

ls -di /tmp 

que me dá o inode 4194305 para /tmp

Agora eu encontraria todos os arquivos vinculados a esse inode com

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

mas isso me dará milhares de loops do sistema de arquivos detectados avisos:

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'.

Como eu ignoro esses erros?

    
por rubo77 07.08.2016 / 07:14

3 respostas

2

A raiz do seu problema é que você disse para encontrar links simbólicos. Isso raramente é uma boa ideia.

Em vez disso, continue agindo nos links simbólicos e filtre os que você deseja.

Você está filtrando arquivos pelo seu número de inode, mas isso parece um erro: parece que você está procurando por arquivos que sejam iguais a /tmp , não arquivos que tenham o mesmo número de inode que /tmp . Seu comando também encontra arquivos que possuem o mesmo inode que /tmp , mas estão localizados em um sistema de arquivos diferente.

Muitas shells (ksh, bash, zsh, dash) têm um operador -ef para o comando test (também escrito [ … ] ) que testa se dois arquivos são iguais.

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

Como alternativa, você pode fazer isso em zsh.

print -lr -- /^media/**/*(@e\''[[ $REPLY -ef /tmp ]]'\')
    
por 08.08.2016 / 00:22
0

Você provavelmente não deve estar descendendo de sistemas de arquivos não físicos (como / proc, / sys etc). Além disso, você tem certeza que find está fazendo o que você quer?

Suponho que você queria excluir /media para esse achado, mas para isso você precisaria de OR ( -o ), como:

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

Além disso, a pergunta diz que você deseja apenas links simbólicos que apontam para o diretório /tmp (e não para nenhum dos arquivos contidos nele). Nesse caso, você executaria algo como:

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

(note que a posição de -follow também é importante)

    
por 07.08.2016 / 14:40
0

Esses loops fazem parte do sysfs pseudo-filesystem que mostra as estruturas de dados do kernel e dispositivos. Você provavelmente não quer descer para isso (ou /proc para esse assunto) se você está apenas procurando por arquivos regulares.

Você poderia -prune da subárvore /sys , como você fez com /media , para removê-la da pesquisa, já que provavelmente não conterá links para /tmp . Com -xdev , você também pode impedir que find se mova de um sistema de arquivos para outro, mas como os links simbólicos podem cruzar os sistemas de arquivos, você precisa listar todos os sistemas de arquivos separadamente na linha de comando. Isto é, algo como

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

Supondo que você não tenha outros sistemas de arquivos além de / , /home e /tmp . Isso também deve remover a necessidade de remover /media , já que as coisas provavelmente são montadas separadamente.

    
por 07.08.2016 / 14:14

Tags