Exclui todos os subdiretórios do find

0

Eu quero procurar em uma pasta por alguns arquivos, mas não quero procurar em nenhum subdiretório.

Eu não quero excluir um diretório, mas Tudo !

Eu tentei este de

find "$dir" -name '*.out' -type d -prune

mas os resultados são os resultados são nada. Alguma ajuda?

    
por Raymond Ghaffarian Shirazi 20.09.2018 / 21:23

4 respostas

0

Você tentou ver o manual?

A opção que você está procurando é -maxdepth , como @StevenPenny já escreveu.

Um motivo pelo qual os resultados são nada é (do manual)

If the whole expression contains no actions other than -prune or -print, -print is performed on all files for which the whole expression is true.

Assim como as suas opções incluem -prune , não há implícito -print . Seu comando só podaria os diretórios chamados *.out .

Se você realmente quiser usar -prune , faça o seguinte:

find "$dir"/* -type d -prune -o -name '*.out' -print

Observe que isso usa "$dir"/* , porque "$dir" é um diretório e seria removido. Isso nega a vantagem de find que não é limitada pelo tamanho máximo do argumento

    
por 20.09.2018 / 21:40
2

Parece que você não precisa realmente de find aqui.

for pathname in "$dir"/*.out; do
    [ ! -f "$pathname" ] && continue

    # do whatever you need to do to "$pathname" here
done

Após o teste -f , "$pathname" apontaria para um arquivo regular ou um link simbólico para um arquivo normal. Observe que arquivos ocultos seriam ignorados, pois * não corresponde a nomes de arquivos que começam com um ponto (a menos que a opção dotglob shell esteja configurada em bash , que você pode ou não estar usando).

com find :

find "$dir" -mindepth 1 -type d -prune -o -type f -name '*.out' -print

O -mindepth 1 faz com que o diretório inicial não seja removido por -type d -prune . O -print deve ser substituído pela ação que você gostaria de executar nos nomes de caminho encontrados (que serão de arquivos regulares com nomes que terminam com .out ).

Ou

find "$dir" ! -path "$dir" -type d -prune -o -type f -name '*.out' -print

Isso usa apenas as opções padrão find e remove todos os diretórios que não são iguais ao caminho inicial.

Alternativamente,

find "$dir" -maxdepth 1 -type f -name '*.out' -print

Usar -maxdepth 1 iria, mais simplesmente, impedir que find fosse descendente em qualquer um dos subdiretórios do diretório inicial.

As opções -mindepth e -maxdepth , embora comumente disponíveis, são extensões para padrão find command , e se sua implementação de find não tiver, você terá que usar o loop de shell ou a alternativa find que usa -prune (com -path ). / p>     

por 20.09.2018 / 21:43
1

A maneira mais simples de realizar essa tarefa (encontrar arquivos em uma pasta excluindo todos os subdiretórios) seria

find $dir -maxdepth 1 -type f -name '*.out' -o '.*.out'

como @StevenPenny e @RalfFriedlal escreveu que a opção maxdepth é o que você está procurando.

Do manual de localização: níveis de -maxdepth               Desça na maioria dos níveis (um inteiro não negativo) dos níveis de diretórios abaixo dos pontos iniciais. -maxdepth 0                significa aplicar apenas os testes e ações aos próprios pontos de partida.

-type f : você está pesquisando por arquivos regulares -name '*.out' -o '.*.out' : o -o significa ou e permite incluir em sua busca eventuaisi arquivos ocultos com a extensão .out.

Desculpe pelo meu mau inglês: (

    
por 20.09.2018 / 23:16
1

com zsh :

printf '%s\n' $dir/*.out(^/)  # files of any type except directory (excluding
                              # hidden ones)
printf '%s\n' $dir/*.out(-^/) # same but also excludes symlinks to directories
printf '%s\n' $dir/*.out(.)   # regular files only (excluding hidden ones)
printf '%s\n' $dir/*.out(-.)  # regular files or symlinks to regular files
                              # (excluding hidden ones)
printf '%s\n' $dir/*.out(D-.) # same, but include hidden ones.
    
por 20.09.2018 / 23:22