列出仅包含名为 Attic 的子文件夹的文件夹

Den*_*ote 6 command-line find files

在迁移到 git 之前,我正在清理 CVS 存储库。作为准备工作的一部分,我需要找到(并可能删除)任何仅包含Attic文件夹的文件夹。

我的 unix-fu 不强,但这是我尝试过的,这不起作用,但希望传达意图。

shopt -s globstar
for file in **/*
do
  if [ -d "$file" ];then
    if [`ls | wc -l` == 1 && `ls Attic | wc -l` == 1]; then
      ((echo Attic-only folder))
    fi
  fi
done
Run Code Online (Sandbox Code Playgroud)

第二部分是找到任何空的文件夹(或文件夹链)。

例如,如果/foo/bar/Attic被移除,并且/foo/bar现在都是空的,那么我们也可以杀死树的那部分。

背景:我正在尝试清理 CVS 存储库以迁移到 git。CVSAttic为已删除的文件创建一个文件夹。在过去的 10 年里,发生了一些坏事。我完全了解风险和影响。我已经备份了我的数据,我正在制作一份副本。

Sat*_*ura 4

bash、GNUfindcomm

comm -12 \
    <( find /path/to/CVS/repo -printf '%h\n' \
        sort | uniq -u ) \
    <( find /path/to/CVS/repo -name Attic -type d -printf '%h\n' | \
        sort )
Run Code Online (Sandbox Code Playgroud)

第一个find打印存储库中所有内容、文件和目录的 basenames ( )。然后打印只有一个后代、文件或目录的目录。-printf '%h\n'sort | uniq -u

然后第二个find打印目录basename的 s Attic。该集合与上面集合的交集(即comm -12)正是仅具有后代的目录Attic

这当然很高兴地忽略了符号链接和其他有趣的东西,以及带有嵌入换行符的文件名。无论如何,您不应该将它们放在 CVS 存储库中。