
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 -quit
depois de usar -delete
ou -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 find
comando:
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 find
comando, 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 bash
shell, 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 zsh
shell 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 {};