Qual é o comando para remover todos os arquivos e pastas, no mac os x terminal?

0

No terminal do Mac OS X, como podemos remover todos os arquivos e pastas, incluindo os ocultos, recursivamente, exceto um diretório?

Obrigado.

    
por MEM 23.04.2015 / 14:43

2 respostas

3

AVISO: a execução de qualquer comando para excluir arquivos recursivamente é perigoso. Sempre, sempre teste antes de executar cegamente esses comandos perigosos e nunca os execute como usuário root (ou com sudo, etc.), nunca.

Isto é relativamente fácil de fazer com um pouco de bash, você pode até fazer um argumento que você passa se você for fazer muito isso. Mas, por uma vez, tente algo como o meu teste simples abaixo.

Primeiro, vou criar algumas pastas para testes:

cd test; mkdir -p one two three four five six .hidden

Em seguida, criarei um script bash (neste caso, rm.bash) com o seguinte conteúdo:

for i in 'ls -A'
do      
        if [ ! "${i}" == 'three' ] && [ ! "${i}" == $0 ]; then 
                echo "would delete ${i}" 
        else    
                echo "not deleting ${i}" 
        fi
done

Para explicar: ls -A imprimirá todos os arquivos, exceto a pasta atual e o pai ( . e .. ). Usamos essa lista com um loop for para iterar todo o conteúdo. Eu decidi (arbitrariamente) que a única pasta que vamos deixar é "três" e que eu não quero apagar o próprio script rm.bash .

Portanto, a condição if só será verdadeira contanto que o arquivo / pasta em questão não seja denominado three ou rm.bash ( $0 significa que isso funciona independentemente do nome do arquivo).

Em vez de executar isso imediatamente com rm -rf ${i} (o que é perigoso), usei alguns comandos echo para mostrar o que será excluído e o que não será.

Aqui foi o meu exemplo de saída:

would delete five
would delete four
would delete one
not deleting rm.bash
would delete six
not deleting three
would delete two

Depois de verificar se o script está tomando as medidas corretas, não excluindo coisas que não devem etc., você pode alterar o código para isso:

for i in 'ls -A'
do      
        if [ ! "${i}" == 'three' ] && [ ! "${i}" == $0 ]; then 
                rm -rf ${i} 
        fi
done
    
por 23.04.2015 / 16:02
1

Uma alternativa. As mesmas advertências se aplicam à resposta de @Adam C; não execute isso sem testá-lo.

Alguns dados de demonstração:

$ mkdir testing; cd testing
$ mkdir one two three four "fi ve"
$ touch one/one.txt two/two.txt three four/keep.txt fi\ ve/.hidden

Simular a exclusão de todos, exceto quatro /

$ find . -mindepth 1  -path ./four -prune -o -exec echo would remove "{}" +

Saída:

would remove ./fi ve ./fi ve/.hidden ./two ./two/two.txt ./one ./one/one.txt ./three

Notas:

-mindepth 1  prevents including /.
Prune removes path four/ from processing, or...
-o means "or" (either prune the left, or exec on the right)
High speed / low resource use:
  find will stop processing a tree once pruned (no wasted operations)
  One xargs-style list is built (with +), removal happens in one command.
  To process one at a time, replace + with \;
Spaces are handled correctly within " "
-delete is shorter but may not operate on directories
find won't follow symlinks by default
    
por 23.04.2015 / 17:57