Removerá rm -rf *
todos os arquivos / pastas no diretório atual? Quero garantir que o curinga *
não suba nos diretórios superiores e apague todo o meu sistema de arquivos. : D
Lembro-me de fazer chmod 777 .* -R
a chmod
arquivos ocultos e chmod
ed todo o meu sistema de arquivos. Obviamente, eu estava na conta raiz.
rm -rf ./*
especificaria explicitamente o diretório atual ... mas Ankur parece dizer que isso não importa.Respostas:
Não, se você não ajustou muito seu shell, isso não removerá arquivos ou diretórios começando com a
.
. Para removê-los também, você pode listá-los explicitamenteou use os padrões glob certos (obrigado Chris)
EDIT 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).fonte
..?*
capturar entradas que começam com ".." (por exemplo..foo
).rm
. portanto, excluir o conteúdo de um diretório com * não é a maneira mais sábia, imho.xargs
está um pouco além do escopo desta questão. Pode-se, por exemplo, começar a pensar sobre isso quando o shell reclama os comprimentos da lista de argumentos.Se você deseja remover um diretório e todo o seu conteúdo, pode inseri-lo
chdir
no diretório pai e norm -rf
diretório por nome, ignorando toda a pergunta pendente. Se você deseja 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 possíveis do diretório, exceto. e ..; é fácil encontrar uma resposta simples (por exemplo,
* .??*
) que funcione quase sempre na prática. Isso é bom para uso interativo, pois é fácil de lembrar e os horários em que não funciona podem ser detectados com um pós-rmls -a
. Para um script, é mais fácil remover tudo e recriar o diretório vazio.fonte
Como acho que essa pergunta é mais sobre o que * faz (e não rm), vamos tentar outra abordagem.
Se você não tiver certeza do que o * faz, você pode "testar" primeiro usando um comando inofensivo como eco. Antes de executar isso, tente adivinhar o que eles mostrarão se você executá-los no diretório dir.
Mas primeiro vamos criar um playground para que possamos brincar com as estrelas e ver o que acabamos.
Agora, nesse diretório, temos o seguinte:
Agora observe o que o * expande para usar o comando echo:
Então, vamos ver o que acontece com o comando rm
Como você vê, ele removeu apenas o arquivo2, pois * foi expandido apenas para o arquivo2. Se você digitar rm -rf. *, Seria o mesmo que escrever
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, existe algum tipo de proteção embutida no rm (algo incomum para comandos do shell :)
Vamos criar um novo playground:
Portanto, agora temos isso de novo, mas com o test1 de propriedade do root como proteção, se o rm começar a enlouquecer.
Então, vamos remover tudo:
E parece que rm não removeu. e .. mesmo se dissermos para ele !!!
Portanto, após essa longa resposta, é seguro remover tudo em um diretório com isso:
Mas eu usaria isso com cuidado, pois não tenho certeza de que todas as implementações de rm se comportem assim!
fonte
Sim. O rm -rf excluirá apenas arquivos e pastas no diretório atual e não subirá na á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 seu sistema de arquivos.
fonte
Se você não quiser subir um nível acima como o mpez0 said e
rm -rf
esta pasta específica, existe uma maneira de trabalhar em todos os diretórios / arquivos, exceto.
e..
na pasta atual, fazendo:Obviamente, se algum dos diretórios / arquivos contiver um dos caracteres da
IFS
variável especial do shell (por exemplo, espaço, guia, nova linha), convém alterar o IFS primeiro, executar o comando e restaurar o IFS.fonte
Uma maneira muito mais fácil de esvaziar uma pasta inteira, também evitando os problemas de "muitos argumentos" discutidos nesta resposta , é simplesmente excluir e recriar o próprio diretório. Para garantir que isso funcione corretamente quando você estiver em um diretório com link simbólico, use as seguintes linhas:
(Se você usar em
yourdir
vez de$(readlink -f yourdir)
substituir apenas o link enquanto o local original permanecer cheio)fonte
xargs
...