Como remover tudo, exceto alguns arquivos?

2

No shell do UNIX, como devo remover tudo de um diretório exceto de um determinado número de arquivos?

Por exemplo, como removerei todos os arquivos e pastas, mas a pasta foo ?

Se há também um equivalente para shell DOS, o que é isso?

    
por unknown 17.08.2009 / 21:57

7 respostas

4

Primeiro, teste com:

find path-to-folder -maxdepth 1 ! -iname 'excludeme' -and -type f -exec ls "{}" \;

Então:

find path-to-folder -maxdepth 1 ! -iname 'excludeme' -and -type f -exec rm "{}" \;

-maxdepth 1 significa procurar apenas na pasta atual (e precisa ser a primeira opção)

-iname (ou -name) diz para não incluir nada que corresponda ao que você quer ficar.

-tipo f garante que você não obtenha diretórios na pasta atual.

    
por 17.08.2009 / 22:26
2
find . -maxdepth 1 -path ./folder -prune -o -exec rm -rf '{}' ';'

Certifique-se de verificar primeiro com alguns dados de teste!

    
por 17.08.2009 / 22:11
2

Para corresponder a tudo, mas algo é geralmente chamado de correspondência inversa . Para expandir filename é o próprio shell que você usa globbing . Se você for chamar um programa fora do shell, você provavelmente desejará encontrar como as pessoas mencionaram.

Você pode fazer uma correspondência inversa com uma nova bash se você habilitar a globalização estendida. Por exemplo, para corresponder a tudo o que não tem foo ou bar no nome:

shopt -s extglob
echo !(*foo*|*bar*)

Ou apenas tudo o que não tem foo:

shopt -s extglob
echo !(*foo*)
    
por 17.08.2009 / 23:08
1

Se não houver arquivos abertos em foo , você poderá movê-lo, excluir tudo e movê-lo de volta.

Não acho que haja uma correspondência "negativa" fácil na globbing de bash , embora você possa fabricar uma usando as correspondências regex e iregex de find .

editar: apenas um pensamento ...

ls | grep -v ^./foo$

listará todos os arquivos, exceto foo, para que você possa usar

ls | grep -v ^./foo$ | xargs rm

embora isso tenha problemas se algum dos nomes de arquivos / diretórios contiver espaços.
Você pode alterar o regex passado para o grep conforme necessário, se quiser corresponder um padrão ao invés de um único arquivo / diretório, ou passar pelo grep mais vezes:

ls | grep -v ^./foo$ | grep -v ^./bar$ | xargs rm -rf

Tenha muito cuidado para testar a saída da sequência find + grep antes de adicionar a etapa xargs rm -rf .

edite novamente: ls faz o mesmo que find . -maxdepth 1 e é provavelmente mais simples.

    
por 17.08.2009 / 22:08
1

Versão para o Windows cmd.exe

Imprima os nomes de todos os diretórios em C: \ exceto os chamados 'foo':

@echo off
FOR /D %A IN (C:\*) DO (IF /I NOT "%A"=="C:\foo" (echo %A))

Imprima os nomes de todos os arquivos em C: \, exceto os chamados 'foo' (ignorando extensões de arquivo):

@echo off
FOR %A IN (C:\*.*) DO (IF /I NOT "%~nA"=="foo" (echo %A))

Imprima os nomes de todos os arquivos em C: \ exceto aqueles com a extensão 'bar':

@echo off
FOR %A IN (C:\*.*) DO (IF /I NOT "%~xA"==".bar" (echo %A))

Imprima os nomes de todos os arquivos em C: \ exceto os chamados 'foo.bar':

@echo off
FOR %A IN (C:\*) DO (IF /I NOT "%~nxA"=="foo.bar" (echo %A))

Altere o comando 'echo' para o que você quiser fazer - por exemplo, 'del'

Todas as opções acima são insensíveis ao caso - remove '/ I' para alterar isso.

Digite 'para /?' para mais detalhes sobre a sintaxe% de FOR.

    
por 27.01.2010 / 14:44
0

Se fosse uma lista pequena, eu faria algo como:

ls -1|egrep -v "(file2|file8)"|xargs rm -rf

O que obtém a lista de arquivos, em seguida, greps para a regex excluindo os arquivos que você deseja manter e remove todo o resto.

Você DEFINITIVAMENTE testará isso deixando a parte xargs para verificar se possui o conjunto correto de arquivos.

    
por 17.08.2009 / 22:15
0

Existe também uma solução mais casual, que é:

  1. mkdir ../ temp
  2. Em precioso1 precioso2 precioso3 ../temp/ (ou mv em vez de ln)
  3. rm -rf *
  4. ln ../temp/*.
  5. rmdir ../ temp

A desvantagem é que seus arquivos preciosos são momentaneamente deslocados. Esta solução não seria adequada se seus preciosos arquivos estivessem disponíveis o tempo todo.

No entanto, esse método tem a vantagem de poder verificar após o passo 2 que seus arquivos preciosos estão seguros. Isso é particularmente significativo se houver arquivos ou subdiretórios ocultos envolvidos, o que aumentaria as chances de cometer um erro com os outros métodos sugeridos aqui.

    
por 17.08.2009 / 22:53

Tags