在 Linux 上删除目录但不删除标记文件的脚本

在 Linux 上删除目录但不删除标记文件的脚本

我运行了一个脚本,它很酷。有没有什么办法可以让这个脚本只在 1 级子目录下运行?

#! /bin/bash
#This will delete the sub-directories of a specific directory when it does not contain a DONOTDELETE.txt or DONOTDELETE.TXT File.

SPECIAL_FILE=DONOTDELETE*
LOGFILE=clean.$(date +"%Y-%d-%m.%H%M%S").log
FIND_BASE="$1"
if [ $# -ne 1 ]; then
        echo "Syntax $(basename $0) <FIND_BASE>"
        exit 1
fi
if [ "$FIND_BASE" = "." ]; then
        FIND_BASE=$(pwd)
else
        FIND_BASE=$(pwd)/$FIND_BASE
fi

for d in $(find $FIND_BASE -type d -print); do
        if [ "$d" != "$FIND_BASE" ]; then
                ls $d | grep $SPECIAL_FILE &> /dev/null
                if [ $? -ne 0 ]; then
                        echo "Deleting $d" | tee -a $LOGFILE
                        rm -rf $d 2>/dev/null
                else
                        echo "Ignoring $d, contains $SPECIAL_FILE" | tee -a $LOGFILE
                fi
        fi
done
exit 0

答案1

find -maxdepth 1

仅在参数目录下查找最大路径深度为 1 的文件。

另外:在尝试更改时,请rm -rf用简单的替换,因为您很可能会这样做echo不是想要通过艰难的方式发现你所做的改变并不符合预期。

-maxdepth 1将使脚本仅在第一个子目录中查找特殊文件,如果未找到,则删除它们。 如果特殊文件位于更深的位置,则必须进行完整的深度检查,但此解决方案符合我对您问题的原始形式的解释。

答案2

由于您使用的是 bash,因此您甚至不需要查找:

shopt -s globstar nullglob

for subdir in "$FIND_BASE"/*/     # the trailing slash picks out just the subdirectories  
do
    # find special files anywhere under the subdir
    flag_files=( "$subdir"/**/DONOTDELETE.{txt,TXT} )  

    if [[ ${#flag_files[*]} -ne 0 ]]; then
        echo "Ignoring $subdir, contains ${flag_files[*]}"
    else
        echo rm -r "$subdir"
    fi

done

相关内容