Linux&SVN:如何删除除KEEP目录结构外的所有版本文件,忽略.svn目录?


9

我想从存储库中删除所有版本控制的文件,但请保留版本控制的目录结构。显然,我想保留所有.svn目录。

换句话说,我想完全清空工作副本的目录结构,而又不损害目录结构本身。

例如,从此结构中删除文件:

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

应导致:

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

我正在寻找某种find命令或某些东西来完成此任务,而在构造命令时遇到了麻烦。谢谢您的帮助!


我这样做的原因是,我有一个Web应用程序,该应用程序是在“版本”中开发的,但之前从未受到版本控制。我现在想将其置于SVN版本控制下,并且为了便于历史参考等,我试图从包含逐渐老版本的四个不同“备份”文件夹中复制四个版本的进度。删除文件后,我可以将较新的文件复制到层次结构中以模拟较新的修订版。不确定是否所有这些都有意义。:)
Brian Lacy

1
值得注意的是,自1.7版(2011年10月)以来,SVN不再具有多个“ .svn”目录,而在顶层仅具有一个.svn目录。参见subversion.apache.org/docs/release-notes/1.7.html#wc-ng
Rich

Answers:


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

应该符合要求(主要来自的查找手册-path)。用管道输送到更少的地方并签出。首先要做的是找到它(路径以.svn结尾,并且不递归到该目录中)或(如果是文件,则将其打印出来)。

如果看起来不错,请将其更改为

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

+版本将所有文件粘贴到一个rm命令中。如果您偏执狂,请先备份树(cp -a dir/ otherdir/)。


完美的解决方案,这正是我所需要的!谢谢Derf!
Brian Lacy 2010年

代替“ -exec rm {} +”,您还可以使用更直观的“ -delete”选项。
Tim Bielawa 2010年

1
@Tim根据查找手册页,它-delete是深度优先的,因此与之冲突,-prune因为在检查文件夹本身之前会先检查文件夹中的文件。另一种解决方案(使用-not -path ...而不是-path ... -prune可以使用-delete选项。
DerfK

好赶上!
蒂姆·比拉瓦

多年来,在各种情况下,我已经多次使用此技巧(或类似技巧)。再次感谢@DerfK。:)
Brian Lacy

2
找 。-not -path“ * /。svn / *” -and -type f -and -exec / bin / rm'{}'\;

应该做的把戏。


只是一个提示,但是可以代替-exec /bin/rm '{}'使用-delete
亚伦·科普利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.