我运行了一个脚本,它很酷。有没有什么办法可以让这个脚本只在 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