从子文件夹中删除同名文件

从子文件夹中删除同名文件

给定以下布局,如何删除 Attic 文件夹中在父文件夹中有对应文件的文件?(文件将具有相同的名称,但不一定具有相同的内容)

/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 为已删除的文件创建了一个“Attic”文件夹。在过去的 10 年里发生了一些不好的事情,这意味着一些同名的文件同时存在于 alive 和 dead 文件夹中。我完全了解风险和影响。我已经备份了我的数据并且正在制作一份副本。

答案1

在bash中:

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

全球星启用后,**将递归匹配文件(无论深度如何)。${var#text}${var%text}允许删除变量的前缀或后缀,因此${file%/*/*}结果是目录名(减去“/Attic/...”),而${file##*/}是基本文件名。

您还应该考虑使用cvs-fast-export和之类的工具reposurgeon;我希望它们从一开始就能正确处理这种情况。如果没有,那么至少要确保您拥有最新版本的cvs2git...

相关内容