find test e bash test não dão o mesmo resultado, por quê?

find test e bash test não dão o mesmo resultado, por quê?

Na minha pergunta anteriorEm find -exec, como substituir o arquivo atual por {}?, perguntei sobre o teste com find. Quero encontrar todos os arquivos que não possuo. Portanto, existe um comando find adequado:

find . -type f ! -user "$USER"

mas também deveria ser este:

find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' bash {} +

no entanto, ambos dão resultados diferentes.

1) se eu fizer [command one] | wc -c-> 4121

Mas: [command two] | wc -c--> 236768 (PS: estou pesquisando arquivos no meu $HOME).

Ambos fornecem números diferentes de quantos arquivos encontraram.

2) Ambos ainda fornecem arquivos de resultados, que sãodiretórios(sim, diretórios que não possuo e, portanto, permissão negada). Eles fornecem diretórios apesar de terem find . -type farquivos de tipo (não dirs) no argumento de opção, por quê? (Quando eu ls -ldestou em um desses diretórios, nenhum é link ou qualquer outra coisa)

Responder1

Hmm..., no meu homedir, os dois comandos funcionam da mesma forma. 8-/

No entanto, você deve redirecionar o stderr para /dev/null e usá-lo wc -lpara contar corretamente a saída.

find . -type f ! -user "$USER" 2>/dev/null | wc -l
find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' 2>/dev/null bash {} + | wc -l

A partir daqui você pode redirecionar os resultados para arquivos de texto e comparar os arquivos para procurar diferenças.

find . -type f ! -user "$USER" 2>/dev/null > /tmp/file_1.txt
find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' 2>/dev/null bash {} + >/tmp/file_2.txt
diff /tmp/file_{1,2}.txt

Se houver diferenças, pegue alguns dos arquivos em excesso de /tmp/file_2.txt e investigue mais detalhadamente por que o arquivo não é considerado 'Verdadeiro se o arquivo existir e pertencer ao ID de usuário efetivo'.

Responder2

Para evitar findentrar em diretórios que não são realmente acessíveis para você, você pode usar ! -executable -prune:

find . ! -executable -prune -type f ! -user "$USER"

O teste negado -executableserá verdadeiro para diretórios aos quais você não tem acesso e -pruneos removerá da findárvore de pesquisa do, impedindo o utilitário de tentar acessá-los e evitando assim gerar erros de permissão.

O -executableteste (assim como os análogos -readablee -writableos testes) não são padronizados e requerem GNU find.

Não posso (ainda) dizer nada sobre as diferenças de resultados, pois você não disse nada sobre elas. Como a saída varia drasticamente em tamanho, deveria ser trivial encontrar e examinar casos em que um comando encontrou algo que o outro comando não encontrou.

informação relacionada