“find” excluir por comportamento estranho fstype

7

Eu tento ter o comando "find" excluindo o sistema de arquivos "/ proc". Eu preferiria que uma solução portátil pudesse usá-la em hosts não baseados em GNU (o AIX mais antigo, por exemplo, onde "find" não tem a opção "-path")

Veja o que eu tentei (em um host Linux) e uma saída filtrada parcial:

$  find /  ! -fstype proc   >/dev/null
find: '/proc/9475/task/9535/fdinfo/7': No such file or directory
find: '/proc/10856': No such file or directory
find: '/proc/10856': No such file or directory
find: '/proc/10858': No such file or directory
find: '/proc/10858': No such file or directory
find: '/proc/15650': No such file or directory
find: '/proc/15650': No such file or directory
find: '/proc/15654': No such file or directory
find: '/proc/15654': No such file or directory
find: '/proc/15656': No such file or directory
find: '/proc/15656': No such file or directory
find: '/proc/15657': No such file or directory
find: '/proc/15657': No such file or directory
find: '/proc/15663': No such file or directory
etc ....

Eu não entendo porque "encontrar" continuar andando dentro do sistema de arquivos "/ proc" apesar da opção "! -fstype proc"?

    
por Gilles Pion 26.09.2018 / 17:03

2 respostas

7

Como terdon explicou , find ainda entrará no diretório /proc , mas não retornará qualquer nome de caminho desse tipo de sistema de arquivos.

Para remover qualquer caminho de pesquisa assim que o tipo de sistema de arquivos proc for detectado, use

find / -fstype proc -prune -o -print

No entanto, como você deseja fazer isso em um antigo find , a opção -fstype pode não estar disponível. Se -path (uma opção padrão de find ) também não estiver disponível, então, será um pouco difícil apresentar sugestões, pois a implementação não é compatível com POSIX.

Uma opção poderia ser usar -xdev , o que faria com que find permanecesse estritamente no mesmo sistema de arquivos que o caminho inicial. Você teria que executar um find para cada sistema de arquivos que deseja examinar. Também pode haver uma opção chamada -x (como nos sistemas BSD), que age como -xdev .

Se isso também não for possível, talvez seja necessário recorrer ao uso de -type d -name proc -prune para desconsiderar todos os diretórios chamados proc .

    
por 26.09.2018 / 18:40
5

A diretiva -fstype informa find para não retornar nenhum resultado que esteja nesse tipo de sistema de arquivos. Isso, no entanto, não significa que não irá olhar para o diretório /proc . Significa simplesmente que não retornará arquivos encontrados em um sistema de arquivos proc . No entanto, ele ainda precisa passar pelo diretório /proc , pois não há como saber se algo, um sistema de arquivos não-proc, foi montado em /proc/something . Por exemplo, no meu Arch, eu acho:

$ find /proc ! -fstype proc -printf '%p %F\n' 2>/dev/null 
/proc/sys/fs/binfmt_misc binfmt_misc
/proc/sys/fs/binfmt_misc/CLR binfmt_misc
/proc/sys/fs/binfmt_misc/register binfmt_misc
/proc/sys/fs/binfmt_misc/status binfmt_misc

Isso ocorre porque /proc/sys/fs/binfmt_misc/ não é um sistema de arquivos proc:

$ mount | grep proc
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=51,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=12642)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)

Portanto, há dois pontos de montagem sob /proc , que contêm sistemas de arquivos não-proc.

Então, com isso em mente, observe que sua pergunta mostra apenas mensagens de erro. Nenhum desses arquivos foi retornado por find , então parece estar se comportando como esperado. Ele percorre os arquivos em /proc , mas não os considera correspondentes se estiverem em um sistema de arquivos proc .

    
por 26.09.2018 / 17:26