Gostaria de saber se posso confiar no comportamento que estou vendo ao usar a opção find
with -depth
e o usuário não tem permissão de execução para um subdiretório.
Assuma a seguinte estrutura de diretório:
drwxrwxrwt. 10 root root 12288 Mar 14 04:31 .
dr-xr-xr-x. 24 root root 4096 Dec 6 03:33 ..
drwx------ 4 root root 4096 Mar 14 04:03 jen
Execute o seguinte comando como usuário não root:
find -type d
A saída é:
.
./jen
find: './jen': Permission denied
Então find
encontrou o diretório jen e produziu isso. Em seguida, ele tentou descer em jen , mas não tinha permissão para imprimir o erro. A primeira linha acima é impressa em stdout
e a segunda linha em stderr
.
Agora, execute o seguinte como usuário não raiz:
find -depth -type d
E a saída é:
find: './jen': Permission denied
.
Portanto, o nome do caminho não é enviado para stdout
, a menos que o usuário tenha permissão para listar o conteúdo do diretório.
Esta saída é perfeita para o que eu quero fazer. No entanto, não tenho certeza se isso é apenas uma coincidência ou não. Posso confiar neste comportamento?
Estou usando o GNU findutils 4.4.2. Eu estou querendo saber se esse comportamento é o mesmo em todas as versões do find
. E se não, é pelo menos o mesmo em todas as versões do GNU find.
Não importa para mim (para este caso de uso) se jen é impresso no primeiro exemplo. Só estou querendo saber se posso depender de ser excluído quando -depth
for usado. Normalmente, não é uma boa ideia confiar em comportamento não documentado. Mas, para mim, esse efeito colateral faz sentido. Então, estou pensando que isso pode ser o comportamento pretendido .
O manual diz:
— Option: -depth
Process each directory's contents before the directory itself.
Isto é exatamente o que eu quero, mas não está claro se o nome do caminho do diretório em si será excluído da saída se não descer nele.
Graças a uma sugestão do Hauke Laging, descobri que posso listar diretórios somente e excluir diretórios explicitamente onde a permissão para listar seu conteúdo é negada:
find -type d \( \( -type d \( \! -executable -or \! -readable \) \) -prune -or -print \)
Isso também tem o efeito de interromper os erros "Permissão negada" porque find
nunca tenta entrar em um diretório se não tiver permissão.
Infelizmente, existem duas razões pelas quais isso não funcionará para as minhas necessidades.
- Eu quero as mensagens de erro
- preciso da opção
-depth
Citando o manual
If the ‘-depth’ option is in effect, the subdirectories will have already been visited in any case. Hence ‘-prune’ has no effect in this case.
Então eu voltei para onde comecei.
Ainda não está claro se "processa ou não o conteúdo de cada diretório antes do próprio diretório." também significa "Não processe o diretório se você não puder processar seu conteúdo".