给定以下布局,如何删除 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
...