Учитывая следующий макет, как я могу удалить файлы в чердачных папках, которые имеют соответствующий файл в родительской папке? (Файлы будут иметь одинаковое имя, не обязательно одинаковое содержимое)

/folder1
    /Attic
        fileA.txt,v  (problem file)
    fileA.txt,v
    fileB.txt,v
    FileC.txt,v
/folder2
    /Attic
        fileD.txt,v  (another problem file)
        fileX.txt,v  (NOT a problem file)
    fileD.txt,v
    fileE.txt,v
    FileF.txt,v

Справочная информация: я пытаюсь очистить хранилище CVS для перехода на git. CVS создает папку «Чердак» для удаленных файлов. За последние 10 лет произошло нечто плохое, что означает, что некоторые файлы с одинаковыми именами существуют как в живых, так и в мертвых папках. Я полностью осознаю риски и последствия. Я сделал резервную копию своих данных, и я работаю над копией.

1 ответ1

2

В Баш:

shopt -s globstar;
for file in ./**/Attic/*; do
    if [[ -e ${file%/*/*}/${file##*/} ]]; then
        rm -vf "$file";
    fi;
done;

При включенном globstar ** рекурсивно сопоставляет файлы (независимо от глубины). ${var#text} и ${var%text} позволяют удалить префикс или суффикс переменной, поэтому ${file%/*/*} приводит к имени каталога (минус "/Attic/…"), а ${file##*/} - это базовое имя файла.

Вы также должны рассмотреть такие инструменты, как cvs-fast-export и reposurgeon ; Я ожидал, что они правильно справятся с такими ситуациями с самого начала. Если нет, то хотя бы убедитесь, что у вас самая последняя версия cvs2git ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .