Como uso o comando find para listar arquivos graváveis ​​em todo o mundo em um diretório sem passar para nenhum subdiretório?

Como uso o comando find para listar arquivos graváveis ​​em todo o mundo em um diretório sem passar para nenhum subdiretório?

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 findacontece.

find / -prune -type f -perm -2

Aqui, você está instruindo finda aplicar -pruneem 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 findencontrada, que é o argumento da linha de comando /, foi -pruneaplicada a ele e, portanto, findnã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 -pruneaos 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 findque 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 -ooperador (“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 findpermitem que você escreva, find / -name / -o -type d -prune -o …mas outras não (por exemplo, BusyBox).

Algumas versões de findopções de suporte -mindepthe -maxdepthpara 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

( -mindepthe -maxdepthsão opções globais, a parte de condições e ações está -type f -perm -2com o final implícito -print.)

informação relacionada