Como excluir diretórios com base na saída `find`: SOMENTE o primeiro resultado

Como excluir diretórios com base na saída `find`: SOMENTE o primeiro resultado

Com base nesta pergunta,

Como deletar diretórios com base na saída `find`?

Tentei remover apenas a primeira pasta de resultado fazendo:

find * -type d | head -n1 | -exec rm -rf {} \;

Mas recebo este erro:

bash: -exec: command not found

O que está errado?

Responder1

Você pode usar -quitdepois de usar -deleteou -exec:

-desistir
Saia imediatamente. Nenhum processo filho será deixado em execução, mas nenhum outro caminho especificado na linha de comando será processado.


Excluindo o primeiro resultado do seu findcomando:

find * -type d -exec rm -Rf {} \; -quit

ou

find . ! -path . -type d -exec rm -Rf {} \; -quit

Este último encontrará pastas ocultas.


Observe que sua saída find podenão ser classificado em ordem alfabética.

Para exclusão do primeiro resultado após a classificação:

find * -maxdepth 1 -type d -print0 | sort -z | head -zn1 | xargs -r0 rm -Rf

Para classificação numérica, use sort -zn.

Responder2

pLumo forneceu adequadamente algumas boas soluções alternativasem sua resposta. Estou fornecendo uma abordagem totalmente diferente.

Você notará que o findcomando, da maneira como você o usa para *descrever os caminhos de pesquisa de nível superior, só é realmente usado paraencontrar o primeiro diretório entre os nomes que *se expande para.

Você também pode fazer isso com um shell loop, o que resulta em um código mais fácil de ler e ver o que ele faz:

shopt -s dotglob nullglob

for name in *; do
    if [ -d "$name" ] && [ ! -h "$name" ]; then
        rm -rf -- "$name"
        break
    fi
done

Este loop, que assume que está sendo executado em um bashshell, itera sobre todos os nomes correspondentes *(incluindo nomes ocultos). O corpo do loop testa se o nome atual é um diretório (sem ser um link simbólico para um diretório) e, em caso afirmativo, exclui o diretório recursivamente antes de sair do loop.

Um efeito semelhante poderia ser obtido no zshshell com um comando muito mais simples

rm -rf -- *(D/[1])

Isso remove o primeiro diretório *para o qual se expande. O qualificador globbing (D/[1])restringe a correspondência *apenas aos diretórios ( /), mas inclui nomes ocultos ( D) e retorna apenas o primeiro nome correspondente ( [1]). Se não houver diretórios no diretório atual, você receberá uma mensagem de erro "nenhuma correspondência encontrada" do shell.

Responder3

Isso parece muito perigoso, mas você pode tentar:

find * -type d | head -n1 | xargs rm -rf

Responder4

para mim funcionou este código:

  • encontra SOMENTE os arquivos com -type f,
  • filtrar arquivos que não contenham ".gz"
  • selecione N arquivos neste caso SOMENTE O PRIMEIRO -n 1

código:

encontrar . -digite f! -nome "*.gz" | cabeça -n 1 | xargs rm -rf {};

informação relacionada