Script que exclui um diretório, mas não exclui arquivos de marcadores no linux

0

Eu tenho um script em execução e é legal e tudo. Alguma idéia de como fazer esse script rodar sob apenas 1 nível de subdiretório?

#! /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
    
por JoyIan Yee-Hernandez 30.03.2012 / 16:42

2 respostas

1
find -maxdepth 1

só encontra arquivos de profundidade máxima do caminho 1 no diretório do argumento.

Além disso, substitua rm -rf por um simples echo ao testar as alterações, pois você provavelmente não quer descobrir da maneira mais difícil que suas alterações não são o que devem ser.

-maxdepth 1 fará com que o script procure apenas o arquivo especial nos primeiros sub-diretórios e, se não for encontrado, exclua-os. Se o arquivo especial for mais profundo, você terá que fazer uma verificação completa de profundidade, mas essa solução se ajusta à minha interpretação da sua pergunta em sua forma original.

    
por 30.03.2012 / 17:01
1

Como você está usando o bash, nem precisa encontrar:

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
    
por 30.03.2012 / 17:33