Удалить одноименные файлы из подпапки

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

/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 ответ

Решение

В Баш:

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...

Другие вопросы по тегам