我想运行一个cron作业,当它超过一个数字时删除目录中的所有文件。
例如,当它变为1000个文件时,则删除该目录中的所有文件。
目标是清除缓存目录。
答案 0 :(得分:2)
#!/bin/bash
CACHE_DIR=/home/cache
if [[ `ls -al $CACHE_DIR | wc -l` -ge 1000 ]] ; then
find $CACHE_DIR -t file -exec rm -f {} \;
fi;
如果文件数等于且大于1000,则删除/ home / cache中的所有常规文件。
答案 1 :(得分:0)
再次,xargs
救援!
(echo ; ls -1 ) | head -n -1000 | head -n 1 | xargs -r rm -f *
第一部分创建目录中所有文件的列表,但前面有一个空行
第二,保留除最后1000行之外的所有行。如果少于1000个文件,则不保留任何内容!
第三,只保留第一行 - 这是空行或没有(如果少于1000个文件)
最后,如果至少有一行输入(那是rm -f *
选项),则仅运行命令-r
编辑:
好的,显然*
在脚本中不起作用。因此,使用fedorqui的想法,您可以使用:
(echo ; ls -1 ) | head -n -1000 | head -n 1 | xargs -r ls -1 | xargs rm -f
因此,只有当文件超过1000个(并将输出转换为rm -f *
)时,才会执行ls -1
而不是rm
答案 2 :(得分:0)
典型的最近最少使用(LRU)缓存只删除最近未使用的旧条目,并保留最近使用的条目,而不是删除所有文件。
ls -ut1 | tail -n+1001 | xargs -n 50 rm
这将按照访问时间对目录中的所有文件进行排序,最近最少访问到底部。尾部省略了前1000并将其余部分发送到删除了em的'xargs rm'。如果文件名很长并且导致单个命令长度超过ARG_MAX,则可能需要xargs的“-n 50”选项。
如果文件少于1000个,那么'xargs rm'会抱怨。要清除它;
ls -ut1 | tail -n+1001 > /tmp/files$$
if [[ `cat /tmp/files$$ | wc -l` -ge 1001 ]] ; then
while read line ; do
rm "$line"
done < /tmp/files$$
fi
rm /tmp/file$$