POSIX encontra todos os arquivos locais

6

Estou tentando escrever uma linha de comando de plataforma cruzada que localizará todos os arquivos locais em um sistema de arquivos.

Minha intenção é usar o comando find , usando apenas parâmetros POSIX. Existe uma maneira de pular arquivos em sistemas de arquivos remotos, enquanto restrito a apenas comandos POSIX e sem programação?

Minha linha de comando atual é

find -type f -print

mas isso obviamente lista todos os arquivos comuns, não apenas os locais.

Estou ciente do sinal -local , mas, até onde sei, não é POSIX ou faz parte de um padrão de plataforma cruzada. locate também não parece ser compatível com várias plataformas. Eu não acho que -xdev flag é o que eu estou procurando, pois quero pesquisar em todos os sistemas de arquivos montados localmente - se / e /home forem locais e eu executar find / -xdev -print , find deve pular /home (a menos que eu esteja entendendo mal o material).

Por que vale a pena, os seguintes URLs foram recursos úteis ...

por atk 11.06.2013 / 23:12

2 respostas

2

Eu não acredito que exista alguma maneira de determinar se um sistema de arquivos é remoto ou local usando apenas interfaces POSIX. O POSIX nem mesmo exige um comando mount , e todas as referências a sistemas de arquivos, até onde eu sei, estão repletas das palavras "implementação definida".

O comando -local primary para o comando find não ajuda muito, pois está disponível apenas no Solaris e depende da existência de um arquivo de configuração que lista os tipos de sistemas de arquivos remotos.

POSIX manda um comando df e requer um formato de saída específico se esse comando for usado com o -P flag; nesse formato, existem seis campos separados por espaços, dos quais o primeiro é o "nome do sistema de arquivos, em um formato definido pela implementação" e o último é o ponto de montagem.

O que você precisa é de uma lista de todos os pontos de montagem correspondentes aos sistemas de arquivos locais. Aqui, acho que você vai ter que voltar para uma heurística; que é excluir nomes de sistemas de arquivos que "pareçam" sistemas de arquivos remotos. Alguns exemplos:

//...     CIFS (Samba)
host:...  NFS
/afs      AFS

Isso não é uma lista exaustiva, e vem completamente sem garantias.

Se você filtrar essas linhas da saída de df e, em seguida, remover as cinco primeiras colunas, poderá alimentar a lista com o comando find com -xdev primary.

Mesmo que isso pareça plausível, na verdade não há garantia de que um sistema de arquivos é realmente "montado" (ver AFS) ou que um sistema de arquivos é totalmente local ou totalmente remoto (um sistema de arquivos baseado em fusível pode redirecionar arbitrariamente arquivos individuais). Então proceda com cautela, é meu conselho.

    
por 12.06.2013 / 05:18
0

Esse -xdev funciona, mas talvez não como você gostaria, ou seja, como indicado em POSIX find man : find -xdev é executado até que o FS com% diferente Device ID (pode ser inspecionado com stat utility ou stat() systemcall) seja encontrado:

por exemplo. linux :

# stat /home/foo
  File: '/home/foo'
    . . .
Device: fd02h/64770d
  . . .
 # stat /boot/foo
  File: '/boot/foo'
  . . . 
Device: 801h/2049d   
  . . .

Vamos encontrá-lo com -xdev :

# find / -xdev -name foo -print
#

sem:

# find / -name foo -print
/home/foo
/boot/foo

Inserindo Device ID em Solaris :

# truss -t lstat64 -v lstat64 ls /foo
lstat64("/foo", 0xFFBFFC48)
    d=0x02580000 . . .
# truss -t lstat64 -v lstat64 ls /etc/foo
lstat64("/etc/foo", 0xFFBFFB88)
    d=0x02580000 . . .
# truss -t lstat64 -v lstat64 ls /opt/foo
lstat64("/opt/foo", 0xFFBFFC48)
    d=0x02580004 . . .
    
por 13.08.2013 / 15:46

Tags