仅针对子目录中的现有目录批量删除 (rm -rf)

Batch removal (rm -rf) just for existing directories in a subdirectory

背景: 我写了一个非常简单的备份删除脚本,它应该删除早于三个版本更新的备份。 这通过始终将我的软件 (Ghost CMS) 的新安装版本添加到 txt 文件中来实现,并且所有版本都位于同一目录中 ($GHOSTDIR/versions/3.x.y).

            nol=$(grep -c . ghostupgradehistory.txt)
            rl=$(echo "$(($nol-3))")
            lc=$(head -$rl ghostupgradehistory.txt)
            kv=$(tail -3 ghostupgradehistory.txt)
            dir=$(ls $GHOSTDIR/versions -d $lc 2> /dev/null)
            if [[ ${dir[@]} ]]; then echo "Delete old versions" && echo $dir && echo "Keep last three versions" && echo $kv
            cd $GHOSTDIR/versions && rm -rf $dir
            fi

ghostupgradehistory.txt 看起来像这样

3.37.1
3.38.0
3.38.1
3.38.2

我遇到的问题是删除已识别的过时版本的最后一个命令。它不只是删除那些,而是删除整个 $GHOSTDIR/versions 文件夹,其中甚至包括最新版本。如何解决这个问题?

如果您确定 GHOSTDIR.

中只有带有版本名称的目录,则可以采用简单的解决方法

首先,您列出所有目录,使最新版本位于顶部,然后从第 4 行开始尾部输出。这意味着 3 个最新版本保持隐藏。最后删除它们。

ls 您可以修改为按时间排序 -t,如果它更相关或保持字母排序。

cd $GHOSTDIR
ls -1rd */ | tail +4 | xargs rm -rf

或(在某些版本上)

cd $GHOSTDIR
ls -1rd */ | tail -n +4 | xargs rm -rf

就是这样。最多保留 3 个目录。