Irá rm -rf * remover todos os arquivos / pastas no diretório atual?

20

rm -rf * removerá todos os arquivos / pastas no diretório atual? Eu quero ter certeza que o curinga * não irá subir nos diretórios superiores e apagar todo o meu sistema de arquivos. : D

Eu me lembro de fazer chmod 777 .* -R a chmod arquivos ocultos e chmod ed todo meu sistema de arquivos. Obviamente, eu estava na conta do root.

    
por Olivier Lalonde 02.04.2010 / 03:16

6 respostas

15

Não, se você não ajustou muito seu shell, isso não removerá arquivos ou diretórios que começam com . . Para removê-los também, você pode listá-los explicitamente

rm -rf .file .dir

ou use os padrões glob corretos (obrigado Chris)

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

EDITAR O ponto aqui é que você não pode usar .* para corresponder arquivos como .file , porque .* ou .*? também corresponderá a .. ou . . .[^.]* corresponde a arquivos como .file , enquanto ..?* corresponde a arquivos como ..foo ( * corresponde a zero ou mais caracteres, enquanto ? corresponde exatamente a um).

    
por 02.04.2010 / 04:08
11

Se você quiser remover um diretório e todo o seu conteúdo, você pode chdir no diretório pai e eles rm -rf desse diretório pelo nome, ignorando toda a questão globbing. Se você quiser remover o conteúdo, mas manter o diretório, é mais fácil remover tudo e depois recriar o diretório.

É complexo criar um glob que corresponda a todas as entradas de diretórios possíveis. e ..; É fácil chegar a uma resposta simples (por exemplo, * .??* ) que funcionará quase sempre na prática. Isso é aceitável para uso interativo, já que é fácil de lembrar e os horários em que ele não funciona podem ser capturados com um post-rm ls -a . Para um script, é mais fácil remover todos os arquivos e recriar o diretório vazio.

    
por 02.04.2010 / 13:37
10

Como acho que essa questão é mais sobre o que * faz (e não o rm), vamos tentar outra abordagem.

Se você não tem certeza do que o * faz, você pode "testar" primeiro usando um comando inofensivo como o echo. Antes de executar isso, tente adivinhar o que eles mostrarão se você executá-los no diretório home.

echo *
echo .*

Mas primeiro vamos criar um playground para podermos brincar com as estrelas e ver o que acabamos fazendo.

mkdir ~/star_test/
cd ~/star_test/
>.file1
>file2

Agora neste diretório, temos isto:

cj@zap:~/star_test$ ls -1a
.
..
.file1
file2

Agora observe o que o * expande usando o comando echo:

cj@zap:~/star_test$ echo *
file2
cj@zap:~/star_test$ echo .*
. .. .file1

Então, vamos ver o que acontece com o comando rm

cj@zap:~/star_test$ rm -rf *
cj@zap:~/star_test$ ls -1a
.
..
.file1

Como você pode ver, ele removeu apenas o arquivo2, já que * só foi expandido para o arquivo2. Se você digitar rm -rf. *, Isso seria o mesmo que escrever

rm -rf . .. .file1

E para ser honesto, isso não parece divertido;)

Espero que isso esclareça a * parte da sua pergunta.

Atualização: No entanto, como Ankur Goel aponta, há algum tipo de proteção embutida no rm (algo incomum para os comandos do shell):

Vamos criar um novo playground:

cd ~/star_test/
mkdir -p test1/test2/test3
sudo chown root.root test1
cd test1/test2/test3/
>.file1
>file2

Agora temos isso novamente, mas com o test1 de propriedade do root como proteção se rm começa a enlouquecer.

cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2  .file1
cj@zap:~/star_test/test1/test2/test3$ echo .*
. .. .file1

Então, vamos remover tudo:

cj@zap:~/star_test/test1/test2/test3$ rm -rf .*
rm: cannot remove directory '.'
rm: cannot remove directory '..'
cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2

E parece que o rm não foi removido. e .. mesmo se disséssemos a ele !!!

Então, após essa longa resposta, é seguro remover tudo em um diretório com isso:

rm -rf * .*

Mas eu usaria isso com cuidado, já que não tenho certeza se todas as implementações do rm se comportam assim!

    
por 02.04.2010 / 08:46
7

Sim. rm -rf excluirá apenas arquivos e pastas no diretório atual e não subirá a árvore de arquivos. O rm também não segue os links simbólicos e exclui os arquivos para os quais eles apontam, para que você não remova acidentalmente outras partes do sistema de arquivos.

    
por 02.04.2010 / 03:26
1

Se você não quiser mover um nível acima como mpez0 said e rm -rf desta pasta específica, há uma maneira de trabalhar em todos diretórios / arquivos, exceto . e .. na pasta atual fazendo:

rm -rf $(ls -A)

Naturalmente, se algum dos diretórios / arquivos contiver um dos caracteres na variável IFS especial do shell (por exemplo, espaço, tabulação, nova linha), você poderá alterar primeiro o IFS, executar o comando e restaurar IFS.

    
por 09.05.2010 / 23:00
0

Uma maneira muito mais fácil de esvaziar uma pasta inteira, evitando também os "muitos argumentos" discutidos em esta resposta , é simplesmente excluir e recriar o diretório em si. Para garantir que isso funcione corretamente quando você estiver em um diretório com links simbólicos, use as seguintes linhas:

cd ..
rm -rf $(readlink -f yourdir) #remove the directory, treat the case of a symlink
                        # by using readlink, to recreate the linked-to directory
mkdir $(readlink -f yourdir) # recreate the directory to have it empty
cd yourdir

(Se você usa yourdir em vez de $(readlink -f yourdir) , você só substituiria o link enquanto o local original permanecesse cheio)

    
por 18.01.2012 / 13:04