Como removo todos os arquivos em uma pasta, exceto apenas alguns arquivos especificados?

11

Eu quero remover todos os arquivos em um diretório, deixando apenas alguns arquivos especificados, eles não têm nada em comum pelo nome. Como eu poderia conseguir isso?

Por exemplo, os nomes dos arquivos que quero manter são:

file_1.png , another_file.jpg , some_music.mp3

    
por AGamePlayer 07.11.2014 / 10:31

3 respostas

14

Se você estiver usando o bash:

shopt -s extglob
rm -- !(file1|file2|file3)

A primeira linha apenas ativa a correspondência estendida de padrões e, depois disso, usamos uma delas:

!(pattern-list) matches anything except one of the given patterns

e a lista de padrões é uma lista de um ou mais padrões separados por | .

Ou com zsh

setopt extendedglob
rm -- ^(file1|file2)

Ou mais portátil, usando find :

find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +
    
por 07.11.2014 / 10:49
7

Crie um subdiretório tmp , mova todos os arquivos que você deseja manter para esse diretório e faça um rm -f * depois. Isso não afetará o diretório tmp .

Depois disso, basta fazer:

mv tmp/* .
rmdir tmp

(Assumindo que nenhum dos arquivos que você moveu começa com um ponto).

Este é um dos poucos casos em que faz sentido usar o mouse e um navegador de arquivos como o Nautilus, onde você pode realmente Ctrl clicar nos poucos arquivos que deseja manter e então usar o menu: Edit -> Invert Selection para pegar os outros arquivos e então deletá-los.

    
por 07.11.2014 / 10:39
2

Adicione os nomes dos arquivos que você deseja manter em um arquivo de texto, um por linha. Este arquivo não deve estar no diretório ou você deve adicionar seu nome também.

Se o nome do seu diretório for foo e o nome do arquivo for bar , faça o seguinte.

find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm

Isso faz o seguinte:

  1. find -type f procura os nomes de todos os arquivos em foo e seus subdiretórios e os imprime em STDOUT. Com a opção -print0 , ele delimita os nomes dos arquivos com bytes NUL.
  2. grep -v -f bar exclui todos os nomes de arquivos que correspondem a uma linha em bar . Com a opção -z , ele trata sua entrada como um conjunto de linhas delimitadas pelo byte NUL, com a opção -Z delimitando sua saída com um byte NUL.
  3. xargs rm chama rm repetidamente para excluir os arquivos. Com a opção -0 , ele trata sua entrada como um conjunto de linhas delimitadas pelo byte NUL.

Isso funciona com nomes de arquivos contendo espaço em branco.

    
por 07.11.2014 / 10:47