rm -rf todos os arquivos e todos os arquivos ocultos sem. & ... erro

62

rm -rf /some/path/* exclui todos os arquivos não ocultos nesse diretório (e subdiretórios).

rm -rf /some/path/.* exclui todos os arquivos ocultos nesse diretório (mas não os subdiretórios) e também apresenta o seguinte erro / aviso:

rm: cannot remove directory: '/some/dir/.'
rm: cannot remove directory: '/some/dir/..'

Qual é a maneira correta de remover recursivamente todos os arquivos e pastas ocultos e não ocultos em um diretório de destino sem receber o aviso / erro sobre . e .. ?

    
por Jake Wilson 26.05.2013 / 06:12

9 respostas

31

Você sempre pode enviar mensagens de erro para /dev/null

rm -rf /some/path/.* 2> /dev/null

Você também poderia apenas

rm -rf /some/path/
mkdir /some/path/

... então você não terá que se preocupar com arquivos ocultos em primeiro lugar.

    
por 27.05.2013 / 01:10
68

* corresponde a todos os arquivos não pontuais, .[!.]* corresponde a todos os arquivos de ponto, exceto . , e arquivos cujo nome começa com .. e ..?* corresponde a todos os arquivos ponto-ponto, exceto .. . Juntos, eles correspondem a todos os arquivos, exceto . e .. . Se algum desses três padrões não corresponder a nada, ele se expandirá para si mesmo; rm -f não se importa com argumentos inexistentes, então isso não importa.

rm -rf ..?* .[!.]* *

Você também pode usar find . Isso é mais complexo, mas tem a vantagem de funcionar mesmo se houver tantos arquivos que os curingas acima se expandirão além do limite de comprimento da linha de comando do sistema.

find . -name . -o -prune -exec rm -rf -- {} +

Você pode achar mais claro remover e recriar o diretório. Isso tem a vantagem (ou desvantagem, conforme o caso) de resultar em um diretório vazio, mesmo que outro programa esteja criando arquivos no diretório original.

    
por 27.05.2013 / 23:20
18

Apenas percebi que essa é a maneira mais conveniente na maioria das distribuições Linux:

ls -A1 | xargs rm -rf

onde

-A = listar tudo exceto . e ..

-1 = coloca todos os itens em uma linha

    
por 30.09.2016 / 11:16
13

Altere a opção dotglob do seu shell e use * ou use algo como find .

find somedir -mindepth 1 -delete
    
por 26.05.2013 / 06:24
3

Isso deve funcionar como a resposta do @Gilles, mas mais compacto:

rm -rf {,.[!.],..?}*

ou

rm -rf dir/to/files/{,.[!.],..?}*

também deve adicionar um if para uso em scripts apenas para garantir:

if [ -d "$DIR" ]; then
    rm -rf ${DIR}/{,.[!.],..?}*
fi
    
por 13.06.2017 / 13:33
2

Encontre seu amigo.

find ! -name '.' ! -name '..' -delete

% find ! -name '.' ! -name '..'
./test
./test4
./test4/.test6
./test3
./.test5
./test2
% find ! -name '.' ! -name '..' -delete    
% find ! -name '.' ! -name '..'     
%             

Se você deseja recursivamente procurar algo diferente do seu diretório atual ($ PWD), adicione um caminho logo após o comando find ; por exemplo, find /path ! -name '.' ! -name '..' -delete . Se você deseja apenas descer n number de diretórios, use a opção -maxdepth n logo após o parâmetro /path .

O comando acima foi testado em um sistema Ubuntu 13.04. Provavelmente funcionará em outros sistemas linux modernos.

    
por 27.05.2013 / 06:04
0

What is the proper way to remove all hidden and non-hidden files and folders recursively in a target directory without receiving the warning/error about . and ..?

Supondo que o diretório em questão é ./dir ,

rm -rf ./dir

removeria todos os arquivos em ./dir , incluindo arquivos e diretórios ocultos, de forma recursiva, e incluindo o próprio diretório ./dir .

Se você não quiser excluir o diretório em si, poderá recriá-lo depois ou usar

find ./dir -mindepth 1 -delete

ou se você find não suporta -delete ,

find ./dir -mindepth 1 -depth -exec rm -rf {} ';'

Usar -mindepth 1 permite manter o diretório de nível superior ./dir .

    
por 09.05.2018 / 15:35
0

Eu sugiro que você experimente com

Ativar ON pontos (arquivos ocultos)

  • defina dotglob

    shopt -s dotglob

Turn- OFF pontos

  • unset dotglob

    shopt -u dotglob

Este método funcionou exatamente como eu desejei para um comando cópia que não continha os diretórios ocultos.

    shopt -s    dotglob
    cp    -rvn  ./$from/*  ./$too/
    shopt -u    dotglob

Então eu fiz um remove (delete), e oops ...

    shopt -s    dotglob
    rm -fr ../message_splitter--044a/*
    shopt -u    dotglob

... que funciona também!

Ocorre-me que você querido leitor não pode ver o diretório message_splitter . De qualquer forma, ele tem uma pasta .svn que precisa ser removida e copiada para.

De man page ...

dotglob If set, bash includes filenames beginning with a '.' in the results of pathname expansion.

Referências

:

por 09.05.2018 / 15:25
-2

Experimente este código:

Dirlist=''find /some/path/ -type d -name '.[^.]*''
for HiddenDir in $Dirlist
do
    rm -rf $HiddenDir
done
    
por 30.10.2015 / 10:41

Tags