我是bash的新手,我的任务是删除所有30天以上的文件,我可以根据文件名Y_M_D.ext
2019_04_30.txt
来解决这个问题。
我知道我可以在包含文件的文件夹中列出所有带有ls
的文件。我知道我可以使用$ date
获取今天的日期,并可以配置它以匹配文件格式$ date "+%Y_%m_%d"
我知道我可以使用rm
删除文件。
如何将所有这些内容捆绑到一个bash脚本中,该脚本可以删除从今天起30天之前的文件?
在伪python代码中,我想它看起来像:
for file in folder:
if file.name to date > 30 day from now:
delete file
答案 0 :(得分:4)
我绝不是系统管理员,但是您可以考虑以下简单的shell脚本:
# Generate the date in the proper format
discriminant=$(date -d "30 days ago" "+%Y_%m_%d")
# Find files based on the filename pattern and test against the date.
find . -type f -maxdepth 1 -name "*_*_*.txt" -printf "%P\n" |
while IFS= read -r FILE; do
if [ "${discriminant}" ">" "${FILE%.*}" ]; then
echo "${FILE}";
fi
done
请注意,专业人员可能会将其视为“外行”解决方案。也许awk
可以更好地处理此问题,很遗憾,我不习惯使用它。
答案 1 :(得分:2)
这是删除30天以上日志文件的另一种解决方案:
#!/bin/sh
# A table that contains the path of directories to clean
rep_log=("/etc/var/log" "/test/nginx/log")
echo "Cleaning logs - $(date)."
#loop for each path provided by rep_log
for element in "${rep_log[@]}"
do
#display the directory
echo "$element";
nb_log=$(find "$element" -type f -mtime +30 -name "*.log*"| wc -l)
if [[ $nb_log != 0 ]]
then
find "$element" -type f -mtime +30 -delete
echo "Successfull!"
else
echo "No log to clean !"
fi
done
允许在多个目录中删除文件
rep_log=("/etc/var/log" "/test/nginx/log")
我们填充变量:我们正在提供的目录中搜索超过30天且名称至少包含.log的文件。然后计算文件数。
nb_log=$(find "$element" -type f -mtime +30 -name "*.log*"| wc -l)
然后我们检查是否存在除0(对映性)以外的结果,如果是,则删除
find "$element" -type f -mtime +30 -delete
答案 2 :(得分:0)
对于X天之前的删除文件,您可以使用此命令并将其安排在/etc/crontab
find /PATH/TO/LOG/* -mtime +10 | xargs -d '\n' rm
或
find /PATH/TO/LOG/* -type f -mtime +10 -exec rm -f {} \