我遇到了一些麻烦,我正在尝试编写一个脚本,该脚本将创建超过 7 天的文件和目录列表,并删除不在 tokeep.list 列表中的文件和目录。我的第一个问题是,如果我将一个目录放在 nodelete 列表上,但该目录内有旧文件,这些文件不会被删除,到目前为止,我能够做到的唯一解决方案是运行一个命令目录和其他文件,它非常丑陋,我不是开发人员。
LogFile=/users/nordic/housekeep.log
source config.cfg
exec &> >(tee $LogFile)
echo "Starting Housekeep files at $host $timestamp"
echo "Creating list of directories to delete"
cd $dir
find $dir/* -maxdepth 1 -type d -mtime +$days > /users/nordic/todelete
if [ $? -eq 0 ]; then
echo OK
else
echo FAIL
fi
echo "deleting directories to listed on todelete file"
dels=`cat /users/nordic/todelete`
readarray -t keeps < /users/nordic/tokeep
for keep in "${keeps[@]}"; do
dels=`echo "$dels" | grep -v "$keep"`
done
echo "$dels" > /users/nordic/todelete
readarray -t dels < /users/nordic/todelete; for del in "${dels[@]}"; do rm -rv "$del"; done
result=$?
if [ $result -eq 0 ]; then
echo SUCCESS |tee /users/nordic/res
else
echo FAILED |tee /users/nordic/res
fi
find $dir/* -maxdepth 1 -type f -mtime +$days -print -delete
#SUBJECT="Automated Housekeep $host $resu"
#TO="[email protected]"
#MESSAGE="$LogFile"
#mailx -s "$SUBJECT" -r "info<[email protected]>" $TO < $MESSAGE
我有一个包含变量的 config.cfg 文件,我想做的是创建要保留的文件和目录名称的列表,并删除其余部分。欢迎任何建议。
答案1
cd "$dir" && \
find . -type d ! -name . -mtime +"$days" \
! -exec sh -c 'printf %s\\n "${1/./$PWD}" | grep -qFf /users/nordic/tokeep' {} {} \; \
-print0 -prune -o -type f -mtime +"$days" -delete |\
xargs -r0 rm -r
在职的
- 成功
cd
进入目录后。谁的名字存储在$dir
我们中 - 启动一个
find
兼顾以下各项的命令:- 为一个
directory
:- 它不是当前目录,并且早于 $days,然后将其名称发送到管道另一端的 xargs,前提是在 tokeep 文件中找不到它。也不要进入该目录,因为它已被标记为许可。
- OTW,
file
如果它们早于 $days,则删除它们。
- 为一个
- 将
xargs
传递将被删除的旧目录。
答案2
我建议创建一个要删除而不是保留的文件列表。
并开始删除目录/或树文件下的文件,我会更好地解释:
按此顺序删除:
/dir1/dir2/file2
/dir1/dir2
/dir1/file1
/dir1