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

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 bash):

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

Saída 'ls':

test 1
test 4
Sandro Munda
fonte
Seria muito semelhante usando find, mas o seu funciona e você foi mais rápido. +1
Rory Alsop 30/03
2
isso falhará se você tiver arquivos com espaços em seus nomes.
Mat
Para lidar com nomes de arquivos com espaços pode-se usarls -1 | grep -v do_not_delete | xargs -I files rm "files"
sebhofer
8

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

rm -rf !(myfile.txt)

Isso usa globbing estendido, portanto, você deve habilitar isso primeiro:

shopt -s extglob
Lauren
fonte
1
 cp myfile.txt somewhere_else;
 rm -rf *
 cp somewhere_else/myfile.txt .
Rayfleck
fonte
1
ln myfile.txt .myfile.txt && rm -rf * && mv .myfile.txt myfile.txt
jlliagre
fonte
0

Para uma recursiva, rmvocê precisará fazer a recursão finde excluir os arquivos que deseja manter (ou grep, mas isso pode causar problemas em espaço em branco). Para um shell glob, os shells modernos têm padrões glob que podem ser usados ​​para excluir arquivos; isso pode ser combinado com a recursão glob no nível do shell, quando disponível (por exemplo, zshhas rm **/*~foo/bar- note que é provável que isso ocorra dentro dos limites de tamanho do argumento para grandes árvores de diretório).

geekosaur
fonte