Linux & SVN: Як видалити всі файли з версією, окрім структури каталогу KEEP, ігноруйте .svn dirs?


9

Я хочу видалити всі файли з версією зі свого сховища, але KEEP структуру каталогу версій. Очевидно, я хочу залишити всі каталоги .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команду чи щось для цього, і у мене виникають проблеми зі створенням команди. Дякую за допомогу!


Причиною цього я є те, що у мене є веб-додаток, розроблений у "версіях", але раніше він не перебував під контролем редагування. Я хочу поставити його під контроль редагування SVN зараз, і для зручності історичної довідки тощо, я намагаюся повторити прогресію чотирьох версій із чотирьох різних "резервних" папок, що містять прогресивно старіші версії. Після видалення файлів я можу скопіювати новіші файли в ієрархію, щоб імітувати новішу версію. Не впевнений, чи все це має сенс. :)
Брайан Лейсі

1
Варто зазначити, що SVN з версії 1.7 (жовтень 2011 р.) Вже не має декількох каталогів ".svn", а лише один .svn dir на верхньому рівні. Дивіться subversion.apache.org/docs/release-notes/1.7.html#wc-ng
Багатий

Відповіді:


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/спочатку збережіть резервну копію дерева ( ).


Ідеальне рішення, саме це мені і потрібно! Дякую Дерфе!
Брайан Лейсі

Замість '-exec rm {} +' ви також можете використовувати інтуїтивнішу опцію '-delete'.
Тім Білава

1
@Tim Відповідно до знайденої сторінки пошуку, вона -deleteє першою глибиною і тому конфліктує з -pruneтим, що файли всередині папки перевірятимуться до того, як сама папка була вивчена. Інше рішення ( -not -path ...скоріше, ніж -path ... -pruneможна використовувати опцію -delete.
DerfK

Приємний улов!
Тім Білава

Цей трюк (або подібний) я багато разів використовував протягом багатьох років у різних сценаріях. Тож ще раз дякую, @DerfK. :)
Брайан Лейсі

2
знайти. -not-шлях "* /. svn / *" -і -тип f -і -exec / bin / rm '{}' \;

Треба зробити трюк.


Просто порада, але замість -exec /bin/rm '{}'вас можна використовувати -delete.
Аарон Коплі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.