错误例子:
FILE_HOME="/home/admin/output/logs"
cd $FILE_HOME
for DIR in `ls $FILE_HOME` ##1
do
cd "./$DIR/abc" ##2
find . -maxdepth 1 -mmin +3 | xargs rm -rf ##3
cd ../.. ##这里使用了相对路径 ##4
done
这个例子不安全
##1这里判断有目录后,如果此时其中一个目录被另一个进程删除
##2这行执行失败
##3会把当前目录(/home/admin/output/logs)下的所有文件删除
##4 cd ../.. 会到/home/admin/下
下一个循环依照上面相同的逻辑##2这行执行失败,##3把/home/admin下所有文件删除
正确的写法
FILE_HOME="/home/admin/output/logs"
for DIR in `ls $FILE_HOME`
do
cd "$FILE_HOME/$DIR/abc" && (find . -maxdepth 1 -mmin +3 | xargs -t -n 1000 rm -rf)
done
1.使用绝对路径
2.使用&&,前一个cd命令执行失败,后一个rm命令不再执行,保证不会误删除