Qual é o histórico por trás do nome da opção xdev em find?

1

Acho o nome da opção xdev contra-intuitivo. Para mim, parece a abreviação de 'cross device (search)'. No entanto, faz o oposto, restringe a pesquisa a um único sistema de arquivos. A alternativa, mas um pouco obsoleta, é "mount", mais memorizável. Qual é a história por trás da nomeação desta opção?

    
por Hontvári Levente 05.11.2018 / 13:17

2 respostas

2

O mais provável é que o dispositivo cruzado realmente funcione, embora na verdade isso signifique fazer não cruzar dispositivos .

Na implementação original no BSD em 1985 , o código tinha:

int    Xdev = 1;       /* true if SHOULD cross devices (file systems) */
[...]
   else if (EQ(a, "-xdev")) {
           Xdev = 0;

Em que Xdev era uma variável interna usada para rastrear se os dispositivos devem ser cruzados. O predicado -xdev define isso como 0.

David Korn, da AT & T, adicionou um predicado similar alguns anos depois para o SVR4 com um -mount de alias para ele (que espelha a bandeira FTW_MOUNT da nova biblioteca de caminhada de árvore).

Não acho a opção -mount particularmente melhor. Presumindo-se por single-mount , também é enganador no Linux, pelo menos onde você pode ter vários pontos de montagem para um sistema de arquivos.

$ mkdir -p a/b b
$ sudo mount --bind a b

Agora, b é um ponto de montagem no mesmo dispositivo como . e a .

$ find . -xdev
.
./b
./b/b
./a
./a/b
$ find . -mount
.
./b
./b/b
./a
./a/b

find não usa dispositivos diferentes ao processar b , mas é um ponto diferente de montagem , portanto -mount (como montagem única) é mais enganoso que -xdev (como Desde que você se lembre, é sobre prevenir cruzar dispositivos).

    
por 05.11.2018 / 16:19
0

É ainda mais complexo que você possa acreditar.

Na implementação de AT & T para find , o recurso é de nftw() que foi introduzido com SVr4 e nftw() veio com um sinalizador FTW_MOUNT que parou nos pontos de montagem e não relatou arquivos com uma entrada st_dev diferente.

O comando SVr4 find possuía -mount e -xdev em 1988 e -xdev era um alias para -mount .

Por outro lado, SunOS e BSD já tinham um -xdev em 1985 e como o SunOS / BSD find não foi implementado em cima de *ftw() , ele poderia usar um diferente sematic e fez. find -xdev on SunOS parou de descer depois que o ponto de montagem com os diferentes st_dev foi impresso.

Em 1992, o primeiro padrão POSIX que incluiu mais do que apenas libc e formatos de arquivo (como tar) mencionou find com -xdev apenas. O problema com esse padrão POSIX é que -xdev tem que relatar os pontos de montagem e parar depois de relatar os pontos do moint enquanto a implementação AT&T parou antes de relatar os pontos de montagem.

O GNU find é uma implementação que segue o texto POSIX.1-1992.

Como resultado, recentemente discutimos um relatório de bug relacionado à teleconferência padrão POSIX e decidimos aprimorar o padrão com um -mount primary e com um FTW_XDEV flag em nftw() .

find -mount precisa se comportar como find se comportou no AT & T UNIX e não deve informar os pontos de montagem.

find -xdev tem que se comportar da maneira como foi escrito no padrão POSIX e precisa informar os pontos de montagem e parar com a descida da árvore.

Isso requer implementações de AT&T find UNIX para alterar sua implementação para -xdev e para permitir que o GNU encontre a alteração do comportamento de -mount .

BTW: AFAIK, sfind/libfind é atualmente a única implementação que já segue as novas regras.

Como libfidnd implementou o código necessário antes que o acordo final para POSIX tenha sido configurado, ele implementa um -mount+ primary e -xdev agora se tornou um alias para -mount+ , que é mais fácil de memorizar para parar nos pontos de montagem, mas além disso, relate-os.

    
por 05.11.2018 / 14:59

Tags