Linux & SVN: Làm cách nào để xóa tất cả các tệp đã được phiên bản nhưng cấu trúc thư mục KEEP, bỏ qua các thư mục .svn?


9

Tôi muốn xóa tất cả các tệp đã được phiên bản khỏi kho lưu trữ của mình, nhưng GIỮ cấu trúc thư mục được phiên bản. Rõ ràng tôi muốn để tất cả các thư mục .svn không bị ảnh hưởng.

Nói cách khác, tôi muốn làm trống hoàn toàn cấu trúc thư mục của bản sao làm việc mà KHÔNG làm hại chính cấu trúc thư mục.

Ví dụ: xóa các tệp khỏi cấu trúc này:

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

Nên dẫn đến:

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

Tôi đang tìm kiếm một số loại findlệnh hoặc một cái gì đó để thực hiện điều này, và tôi gặp khó khăn khi xây dựng lệnh. Cảm ơn đã giúp đỡ!


Lý do tôi làm điều này là vì tôi có một ứng dụng web đã được phát triển theo "phiên bản" nhưng chưa bao giờ được kiểm soát sửa đổi trước đây. Tôi muốn đặt nó dưới sự kiểm soát sửa đổi SVN ngay bây giờ và để dễ tham khảo lịch sử, v.v., tôi đang cố gắng sao chép tiến trình của bốn phiên bản từ bốn thư mục "sao lưu" khác nhau chứa các phiên bản cũ hơn. Khi các tệp bị xóa, tôi có thể sao chép các tệp mới hơn vào cấu trúc phân cấp để mô phỏng bản sửa đổi mới hơn. Không chắc chắn nếu tất cả điều đó có ý nghĩa. :)
Brian Lacy

1
Điều đáng chú ý là SVN kể từ phiên bản 1.7 (tháng 10 năm 2011) không còn có nhiều thư mục ".svn", mà chỉ có một thư mục .svn ở cấp cao nhất. Xem subversion.apache.org/docs/release-notes/1.7.html#wc-ng
Giàu

Câu trả lời:


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

phải phù hợp với hóa đơn (chủ yếu đến từ trang tìm kiếm -path). Ống nó để ít hơn và kiểm tra xem nó ra. Những gì nó làm là tìm thấy đầu tiên (đường dẫn kết thúc bằng .svn và không lặp lại (cắt tỉa) thư mục này) hoặc (nếu đó là một tệp, in nó).

Nếu nó trông ổn, hãy đổi nó thành

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

Phiên bản + gắn tất cả các tệp lại với nhau thành một lệnh rm. Nếu bạn bị hoang tưởng, trước tiên hãy giữ một bản sao lưu của cây ( cp -a dir/ otherdir/).


Giải pháp hoàn hảo, đó chính xác là những gì tôi cần! Cảm ơn Derf!
Brian Lacy

Thay cho '-exec rm {} +', bạn cũng có thể sử dụng tùy chọn '-delete' trực quan hơn.
Tim Bielawa

1
@Tim Theo manpage tìm kiếm, -deletelà độ sâu trước tiên và do đó mâu thuẫn với -prunevì các tệp trong thư mục sẽ được kiểm tra trước khi chính thư mục được kiểm tra. Giải pháp khác (sử dụng -not -path ...thay vì -path ... -prunecó thể sử dụng tùy chọn -delete.
DerfK

Bắt tốt đẹp!
Tim Bielawa

Tôi đã sử dụng thủ thuật này (hoặc tương tự) nhiều lần trong nhiều năm qua trong nhiều tình huống khác nhau. Cảm ơn một lần nữa, @DerfK. :)
Brian Lacy

2
tìm thấy . -không -path "* /. svn / *" -and -type f -and -exec / bin / rm '{}' \;

Phải làm thủ thuật.


Chỉ là một mẹo, nhưng thay vì -exec /bin/rm '{}'bạn có thể sử dụng -delete.
Aaron Copley
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.