Como excluir todos os arquivos, exceto um, no Unix? [duplicado]

13

Como deletar todos, exceto um (ou alguns) arquivos no Unix?

Algo como

 rm -rf -ignore myfile.txt *
    
por Jean 30.03.2011 / 20:02

6 respostas

20
ls * | grep -v dont_delete_this_file | xargs rm -rf 

Exemplo:

mkdir test && cd test
touch test1
touch test2
touch test3
touch test4
touch test5

Para remover todos os arquivos, exceto 'test2':

ls * | grep -v test2 | xargs rm -rf

Então a saída 'ls' é:

test2

EDITAR:

Obrigado pelo comentário. Se o diretório contiver alguns arquivos com espaços:

mkdir test && cd test
touch "test 1"
touch "test 2"
touch "test 3"
touch "test 4"
touch "test 5"

Você pode usar (com o bash):

rm !("test 1"|"test 4")

Saída 'ls':

test 1
test 4
    
por 30.03.2011 / 20:05
8

Supondo que você esteja usando o shell bash (o caso mais comum), você pode usar o símbolo negation globbing (expansão do nome do caminho):

rm -rf !(myfile.txt)

Isso usa globbing estendido, então você precisa ativar isso primeiro:

shopt -s extglob
    
por 30.03.2011 / 20:08
1
 cp myfile.txt somewhere_else;
 rm -rf *
 cp somewhere_else/myfile.txt .
    
por 30.03.2011 / 20:06
1
ln myfile.txt .myfile.txt && rm -rf * && mv .myfile.txt myfile.txt
    
por 10.03.2012 / 19:53
0

Esta página oferece uma variedade de opções dependendo do shell: link

    
por 30.03.2011 / 20:05
0

Para um rm recursivo, é necessário fazer a recursão com find e excluir o (s) arquivo (s) que você deseja manter (ou grep , mas isso pode colocar você em problemas de espaço em branco). Para um shell glob, os shells modernos possuem padrões glob que podem ser usados para excluir arquivos; isso pode ser combinado com a recursão do glob no nível do shell quando disponível (por exemplo, zsh tem rm **/*~foo/bar - observe que é provável que isso corra em limites de tamanho de argumento para árvores de diretórios grandes).

    
por 30.03.2011 / 20:06

Tags