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 f
arquivos de tipo (não dirs) no argumento de opção, por quê? (Quando eu ls -ld
estou 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 -l
para 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 find
entrar 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 -executable
será verdadeiro para diretórios aos quais você não tem acesso e -prune
os removerá da find
árvore de pesquisa do, impedindo o utilitário de tentar acessá-los e evitando assim gerar erros de permissão.
O -executable
teste (assim como os análogos -readable
e -writable
os 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.