Considere alguns sistemas * nix comuns (como Debian, CentOS, Arch e Kali).
Eu sempre usado find
; Não me lembro de usar o GNU find, mas a partir de um exemplo que vi, presumi que a sintaxe do GNU find pode ser mais simples (embora pode permitir menos operações).
Tenho duas perguntas:
-
É
find
o utilitário padrão “localizar ou operar” em sistemas comuns ou os sistemas virão com ambosfind
eGNU find
? -
Era
GNU find
pretendia ser mais simples defind
?
Comentários
Resposta
Os utilitários GNU geralmente implementam o padrão POSIX e também o estendem com funcionalidade extra para maior conveniência (e, como o outro lado disso, diminuiu a portabilidade em Unices). O aspecto da portabilidade é porque você às vezes verá respostas ou comentários neste site que são muito cuidadosos em apontar quando um utilitário GNU ou alguma outra implementação específica de um utilitário é assumido.
Se você estiver em um Linux sistema, você muito provavelmente estaria usando a implementação GNU de find
e provavelmente não teria outro find
instalado. Em sistemas não Linux, você teria um find
nativo e a possibilidade de também instalar GNU find
(que na maioria das vezes seria instalado sob o nome gfind
ou, com menos frequência, gnufind
).
Como a maioria dos utilitários GNU, GNU find
implementa e estende a especificação find
padrão . Portanto, não é “mais simples”, mas indiscutivelmente mais complexo para ser mais conveniente, e seria um pouco mais fácil realizar certas tarefas complexas com ele do que com um find
compatível com o padrão estrito .
Implementações estendidas de find
frequentemente, por exemplo, implementam -maxdepth
e -mindepth
predicados que o padrão não menciona, e GNU find
em particular também tem -printf
para imprimir os nomes de caminho encontrados usando uma variedade de possibilidades de formatação (o find
padrão não tem -printf
) e predicados para fazer correspondência de expressão regular de vários tipos em nomes de caminho, bem como uma série de outros predicados não padrão, alguns dos quais também são encontrados em outras implementações de find
(possivelmente com semânticas ligeiramente diferentes, como -execdir
whi ch funciona um pouco diferente dependendo do que find
está sendo usado 1 ).
O -delete
predicado, usado na resposta para a qual você se vincula, não é padrão, mas implementado pelo GNU find
, bem como no find
em alguns outros sistemas não Linux. GNU find
“s -delete
irá reclamar se você usá-lo para deletar um diretório não vazio, mas a opção correspondente com, por exemplo, OpenBSD” s find
não (nem excluirá o diretório não vazio).
A maioria dos sistemas Linux, independentemente da distribuição, usa o mesmo conjunto de ferramentas coreutils e findutils (variantes como Busybox existe, obviamente). Para usar um conjunto completamente diferente de implementações de ferramentas, você teria que mudar para um dos sistemas BSD de código aberto ou para macOS, Solaris, AIX ou algum outro Unix comercial.
1 GNU find
adiciona ./
a nomes de caminho ao usar -execdir
enquanto algumas outras implementações não.
Comentários
- E
-print0
, e-direxec
e-delete
e … ;-). As opções de separador nulo disponíveis nas ferramentas GNU são particularmente convenientes. - @StephenKitt Mas raramente necessário 🙂
- certo, exceto ao escrever respostas não POSIX aqui ;-). (Ou scripts que precisam funcionar em qualquer lugar .)
- O principal problema com a documentação GNU é que ela tenta permitir que as pessoas usem apelidos não-padrão para métodos POSIX e, assim, causar o scripts relacionados para criar um bloqueio de fornecedor.
- @StephenKitt
-print0
também está disponível em * bsd e solaris; mas no solarisxargs -0
não ' funciona, entãogxargs -0
(de/usr/bin/sfw
) deve ser usado.
Resposta
A que as pessoas costumam se referir como Linux é melhor referido como GNU / Linux: Linux mais GNU. Portanto, as ferramentas que você está usando provavelmente são GNU.
- Linux: um kernel, é usado em GNU / Linux, Android e muitos outros sistemas.
- GNU: um sistema operacional, geralmente usado com o kernel Linux, mas também pode ser usado com BSD, Hurd, Cygwin (uma DLL para Windows da Microsoft, que finge ser um kernel), WSL (Subsistema Windows para Linux: GNU sem Linux, em Microsoft Windows), HPUX, Solaris, Dec Athena e muitos outros.
Portanto, você provavelmente está usando o GNU find.
GNU é um projeto a ser refeito escreva, uma versão gratuita (gratuita como na liberdade, não como no preço) de todo o Unix, incluindo ferramentas como find
, o projeto GNU não se preocupa com a conformidade com POSIX: ele estará em conformidade onde fizer sentido, mas também fará melhorias.
Além disso, você pressupõe que haja apenas um outro find
está errado.
find
no busybox ou android 😉 Em sistemas não Linux, GNU find é geralmente denominadogfind
.find --version
😉find
implementação nesses sistemas seja GNUfind
.