Linux & SVN: Bagaimana menghapus semua file berversi tetapi tetap struktur direktori KEEP, abaikan dir .svn?

9

Saya ingin menghapus semua file berversi dari repositori saya, tetapi TETAPKAN struktur direktori berversi. Jelas saya ingin membiarkan semua direktori .svn tidak tersentuh.

Dengan kata lain, saya ingin benar-benar mengosongkan struktur direktori copy pekerjaan TANPA merusak struktur direktori itu sendiri.

Misalnya, menghapus file dari struktur ini:

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

Harus menghasilkan:

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

Saya sedang mencari semacam findperintah atau sesuatu untuk mencapai ini, dan saya mengalami kesulitan membangun perintah. Terima kasih untuk bantuannya!

Brian Lacy
sumber
Alasan saya melakukan ini adalah karena saya memiliki aplikasi web yang telah dikembangkan dalam "versi" tetapi belum pernah di bawah kendali revisi sebelumnya. Saya ingin meletakkannya di bawah kendali revisi SVN sekarang, dan untuk kemudahan referensi sejarah, dll., Saya mencoba mereplikasi perkembangan empat versi dari empat folder "cadangan" yang berbeda yang mengandung versi yang lebih lama secara progresif. Setelah file dihapus, saya dapat menyalin file yang lebih baru ke dalam hierarki untuk mensimulasikan revisi yang lebih baru. Tidak yakin apakah semua itu masuk akal. :)
Brian Lacy
1
Perlu dicatat bahwa SVN sejak versi 1.7 (Oktober 2011) tidak lagi memiliki beberapa direktori ".svn", tetapi hanya satu dir .svn di tingkat atas. Lihat subversion.apache.org/docs/release-notes/1.7.html#wc-ng
Rich

Jawaban:

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

harus sesuai dengan tagihan (sebagian besar berasal dari manual find for -path). Pipa kurang dan periksa. Apa yang dilakukannya adalah menemukan pertama (path berakhir dengan .svn dan jangan muncul kembali ke dalam (prune) direktori ini) atau (jika itu file, cetaklah).

Jika terlihat bagus, ubah ke

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

Versi + menempelkan semua file menjadi satu perintah rm. Jika Anda paranoid, simpan cadangan pohon ( cp -a dir/ otherdir/) terlebih dahulu.

DerfK
sumber
Solusi sempurna, itulah yang saya butuhkan! Derf terima kasih!
Brian Lacy
Di tempat '-exec rm {} +' Anda juga dapat menggunakan opsi '-delete' yang lebih intuitif.
Tim Bielawa
1
@Tim Menurut manpage find, -deleteadalah kedalaman-pertama dan karenanya bertentangan dengan -prunekarena file di dalam folder akan diperiksa sebelum folder itu sendiri diperiksa. Solusi lain (menggunakan -not -path ...daripada -path ... -prunebisa menggunakan opsi -delete.
DerfK
Tangkapan bagus!
Tim Bielawa
Saya telah menggunakan trik ini (atau serupa) berkali-kali selama bertahun-tahun dalam berbagai skenario. Terima kasih sekali lagi, @ DerfK. :)
Brian Lacy
2
Temukan . -tidak -path "" /. svn / * "-dan -tipe f -dan -exec / bin / rm '{}' \;

Seharusnya melakukan trik.

menandai
sumber
Hanya tip, tetapi -exec /bin/rm '{}'Anda tidak bisa menggunakannya -delete.
Aaron Copley