Linux e SVN: Como remover todos os arquivos com versão, exceto a estrutura de diretórios KEEP, ignore os diretórios .svn?

9

Quero remover todos os arquivos com versão do meu repositório, mas MANTER a estrutura de diretório com versão. Obviamente, quero deixar todos os diretórios .svn intocados.

Em outras palavras, quero esvaziar completamente a estrutura de diretórios de uma cópia de trabalho SEM prejudicar a própria estrutura de diretórios.

Por exemplo, removendo os arquivos desta estrutura:

dir/
    .svn/
        [files]
    svsubdir1/
        file1
        .svn/
            [files]
    subdir2/
        file2
        file3
        file4
        .svn/
            [files]
        subsubdir1/
            file5
            .svn/
                [files]

Deve resultar em:

dir/
    .svn/
        [files]
    svsubdir1/
        .svn/
            [files]
    subdir2/
        .svn/
            [files]
        subsubdir1/
            .svn/
                [files]

Estou procurando algum tipo de findcomando ou algo para fazer isso, e estou tendo problemas para construir o comando. Obrigado pela ajuda!

Brian Lacy
fonte
A razão pela qual estou fazendo isso é que tenho um aplicativo da Web desenvolvido em "versões", mas que nunca esteve sob controle de revisão. Quero colocá-lo sob controle de revisão SVN agora e, para facilitar a referência histórica, etc., estou tentando replicar uma progressão de quatro versões de quatro pastas diferentes de "backup" que contêm versões progressivamente mais antigas. Depois que os arquivos são excluídos, posso copiar os arquivos mais recentes na hierarquia para simular a revisão mais recente. Não tenho certeza se tudo isso faz sentido. :)
Brian Lacy
1
Vale ressaltar que o SVN desde a versão 1.7 (outubro de 2011) não possui mais vários diretórios ".svn", mas apenas um diretório .svn no nível superior. Veja subversion.apache.org/docs/release-notes/1.7.html#wc-ng
Rich

Respostas:

10
find dir/ -path '*/.svn' -prune -o -type f -print

deve caber na conta (a maioria vem da página de localização de -path). Tubo para menos e confira. O que ele faz é primeiro encontrar (o caminho termina em .svn e não recursa (remove) neste diretório) ou (se for um arquivo, imprima-o).

Se parecer bom, altere-o para

find dir/ -path '*/.svn' -prune -o -type f -exec rm {} +

A versão + une todos os arquivos em um comando rm. Se você é paranóico, faça um backup da árvore ( cp -a dir/ otherdir/) primeiro.

DerfK
fonte
Solução perfeita, é exatamente isso que eu precisava! Obrigado Derf!
Brian Lacy
No lugar de '-exec rm {} +', você também pode usar a opção '-delete' mais intuitiva.
Tim Bielawa
1
@ Tim De acordo com a página de manual de localização, -deleteé aprofundada e, portanto, entra em conflito -pruneporque os arquivos dentro da pasta seriam verificados antes de a própria pasta ser examinada. A outra solução (usando, em -not -path ...vez de, -path ... -prunepode usar a opção -delete.
DerfK 26/10/10
Boa pegada!
Tim Bielawa
Eu usei esse truque (ou similar) várias vezes ao longo dos anos em uma variedade de cenários. Então, obrigado novamente, @DerfK. :)
Brian Lacy
2
encontrar . -not -path "* /. svn / *" -e -tipo f -e -exec / bin / rm '{}' \;

Deveria fazer o truque.

marca
fonte
Apenas uma dica, mas em vez de -exec /bin/rm '{}'você pode usar -delete.
Aaron Copley