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

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

1
 cp myfile.txt somewhere_else;
 rm -rf *
 cp somewhere_else/myfile.txt .

1
ln myfile.txt .myfile.txt && rm -rf * && mv .myfile.txt myfile.txt


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).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.