
A solução para este problema tem me escapado há semanas. Estou tentando escrever um comando para encontrar apenas arquivos graváveis em todo o mundo em um conjunto específico de diretórios, sem passar por nenhum subdiretório usando -prune
.
Eu tentei uma infinidade de opções diferentes apenas para ficar com
find / -type f -perm -2
No entanto, isso ainda atravessa os subdiretórios. Usando o comando
find / -prune -type f -perm -2
também não produz resultados. Onde estou errando com isso?
Responder1
Tente usar maxdepth N
:
-níveis máximos de profundidade
Desça na maioria dos níveis (um número inteiro não negativo) níveis de diretórios abaixo dos pontos de partida. -maxprofundidade 0 significa aplicar apenas os testes e ações aos próprios pontos de partida.
find $FOLDER -maxdepth 1 -perm -2
Responder2
find / -type f -perm -2
Isso é recursivo. É isso que find
acontece.
find / -prune -type f -perm -2
Aqui, você está instruindo find
a aplicar -prune
em tudo que encontrar. As condições e ações são processadas da esquerda para a direita; como não há condição antes -prune
, ela é aplicada incondicionalmente. Portanto, a primeira coisa find
encontrada, que é o argumento da linha de comando /
, foi -prune
aplicada a ele e, portanto, find
não atravessa o conteúdo do diretório. Como /
não atende às seguintes condições, não é impresso.
Para processar apenas as entradas do diretório de nível superior, você precisa aplicar -prune
aos diretóriosexceto os argumentos da linha de comando. A maneira portátil de fazer isso é usar /.
no final do caminho passado na linha de comando. Isso faz com find
que o nome deles seja tratado como .
, para que você possa usá-los -name .
para combiná-los. Em uma travessia recursiva, nenhum arquivo é chamado, .
pois esse nome é reservado. Agora existem três casos diferentes:
- Diretório de nível superior: recurse.
- Outro diretório: não recorra.
- Arquivo normal que pode ser escrito mundialmente: print.
Para especificar vários comportamentos diferentes, use o -o
operador (“ou”). O primeiro ao qual todas as condições correspondem se aplica.
find /. -name . -o -type d -prune -o -type f -perm -2 -print
Algumas versões find
permitem que você escreva, find / -name / -o -type d -prune -o …
mas outras não (por exemplo, BusyBox).
Algumas versões de find
opções de suporte -mindepth
e -maxdepth
para restringir a travessia recursiva. Se o seu achado suportar, você pode usar isso em vez de -prune
.
find / -mindepth 1 -maxdepth 1 -type f -perm -2
( -mindepth
e -maxdepth
são opções globais, a parte de condições e ações está -type f -perm -2
com o final implícito -print
.)