У меня запущен скрипт, и он крут и все. Любая идея, как заставить этот сценарий работать только под 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

2 ответа2

1
find -maxdepth 1

находит только файлы с максимальной глубиной пути 1 в каталоге аргументов.

Также: замените rm -rf простым echo при проверке изменений, так как вы, скорее всего, не захотите выяснить, каким сложным образом ваши изменения не такие, какими они должны быть.

-maxdepth 1 заставит скрипт искать только специальный файл в первых подкаталогах, и если он не найден, удалите их. Если специальный файл находится глубже, вы должны выполнить полную проверку глубины, но это решение соответствует моей интерпретации вашего вопроса в его первоначальном виде.

1

Поскольку вы используете 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .