我想运行一个 cron 作业,当它超过一个数字时删除目录中的所有文件。
例如,当它变成 1000 个文件时,则删除该目录中的所有文件。
目标是清除缓存目录。
#!/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 中的所有常规文件。
典型的最近最少使用 (LRU) 缓存不会删除所有文件,而是删除那些最近不使用的旧条目并保留最近使用的条目。
ls -ut1 | tail -n+1001 | xargs -n 50 rm
这将按访问时间对目录中的所有文件进行排序,最近最少访问到底部。Tail 省略了前 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$$
再次,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