Como uso o comando find para listar os arquivos graváveis do mundo em um diretório sem atravessar nenhum subdiretório?

1

A solução para este problema tem me escapado há semanas. Eu estou tentando escrever um comando para encontrar apenas arquivos graváveis do mundo em um conjunto específico de diretórios sem atravessar qualquer subdiretório usando -prune .

Eu tentei uma infinidade de opções diferentes apenas para ficar com

find / -type f -perm -2

Isso, no entanto, ainda é encaminhado para os subdiretórios. Usando o comando

find / -prune -type f -perm -2

não produz resultados também. Onde estou indo errado com isso?

    
por M L 23.09.2016 / 16:13

2 respostas

4

Tente usar maxdepth N :

-maxdepth levels
Descend at most levels (a non-negative integer) levels of directories below the starting-points. -maxdepth 0 means only apply the tests and actions to the starting-points themselves.

find $FOLDER -maxdepth 1 -perm -2
    
por 23.09.2016 / 16:25
1
find / -type f -perm -2

Isso é recursivo. Isso é o que o find faz.

find / -prune -type f -perm -2

Aqui, você está instruindo find a aplicar -prune a tudo o que encontrar. As condições e ações são processadas da esquerda para a direita; já que não há condição antes de -prune , é aplicado incondicionalmente. Portanto, a primeira coisa que find encontra, que é o argumento de linha de comando / , tem -prune aplicado a ele e, portanto, find não percorre o conteúdo do diretório. Como / não corresponde à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órios , exceto 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 que find trate seu nome como . , portanto, você pode usar -name . para corresponder a eles. Em um percurso recursivo, nenhum arquivo é chamado . , pois esse nome é reservado. Agora existem três casos diferentes:

  • Diretório de nível superior: recursivo.
  • Outro diretório: não recurse.
  • Arquivo regular que pode ser escrito mundialmente: imprimir.

Para especificar vários comportamentos diferentes, use o operador -o (“ou”). O primeiro para o qual todas as condições correspondem se aplica.

find /. -name . -o -type d -prune -o -type f -perm -2 -print

Algumas versões de find permitem que você escreva find / -name / -o -type d -prune -o … , mas outras não (por exemplo, BusyBox).

Algumas versões de find suportam as opções -mindepth e -maxdepth para restringir a passagem recursiva. Se a sua pesquisa for compatível, você poderá 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 é -type f -perm -2 com o rastreio implícito -print .)

    
por 25.09.2016 / 01:29