作为磁盘清理的一部分,我现在需要删除过去 3 天(不是当前营业日期)创建的所有文件夹及其内容:
示例 - 今天的日期是 20191121,那么:
/opt/png/wsm/data/workdir/batch/*20191120*
/opt/png/wsm/data/workdir/batch/*20191119*
/opt/png/wsm/data/workdir/batch/*20191118*
我现在能做的就是获取列表:
ls -d */ | grep 20191118 (and then 19 and 20)
如何检查通过删除特定日期的文件夹及其内容可以节省多少大小?
服务器上的 bash 版本是:
bash-3.2$ bash --version
GNU bash, version 3.2.57(1)-release (i386-pc-solaris2.10)
Copyright (C) 2007 Free Software Foundation, Inc.
答案1
清理文件和文件夹时,您可能需要使用该du
命令。
du
列出驱动器空间使用情况,有一个--time
选择,并且可以使用仅适用于目录。结合它们:
du -h */ --time | grep -E '2019\-09\-(18|19|20)'
这将获取其内容最后在 11 月 18 日、19 日或 20 日创建或修改的任何子目录。它将输出大小(-h
人类可读)、修改日期,最后是路径。
答案2
如果您尝试 rm 的目录包含超过 5000 个文件,则先前的答案将失败。这将为您留下未删除的旧目录。
使用 find 代替“-exec rm {} \+”,这将调用 rm 一次或多次,每次调用最多 5000 个参数。
为了查找已修改的文件/目录,请使用 find
find . -type d -atime n # for exact number of days
find . -type d -atime +n # for greater than n days
您可以添加 -daystart 选项来测量从今天开始而不是 24 小时前的时间
然后,使用“-exec rm {} \+”删除或使用“-exec du -sh {} \;”获取每个目录的磁盘使用情况。
还要考虑 find + du 调用的 -maxdepth 选项,以将查找限制为顶层目录。
请参阅“man find”以获取更多信息(从终端(最好)或从 man7.org 获取最新的手册页:http://man7.org/linux/man-pages/man1/find.1.html,但不是从 Die.net 获取的(他们甚至删除了页面时间戳,所以你不知道他们的手册页是否已经过时或过期)。
答案3
然后为 @Kusalananda 解决方案提供更短且(从我的角度来看)更易读的语法,并使用日期而不是 gdate (尽管 gdate 可能是 Solaris 上的日期等效项?):
days=$(echo -e "1 day ago \n 2 days ago \n 3 days ago" | date -f - +'%Y%m%d')
dpath="/opt/png/wsm/data/workdir/batch"
for day in $days ; do
du -s -h "$dpath/$day"
rm -r -f "$dpath/$day"
done
答案4
如果您的 Solaris 系统有bash
,那么它通常也会有 zsh。
由于该日期格式恰好像数字一样排序,因此您可以使用 zsh 的<start-end>
十进制数字范围全局运算符:
zsh -c '
zmodload zsh/datetime
now=$EPOCHSECONDS day=$(( 24 * 60 * 60 ))
for var t (start $(( now - 3*day )) end $(( now - 1*day )) )
strftime -s $var %Y%m%d $t
range="<$start-$end>"
rm -rf -- *$~range*(/)
'
请注意,如果在夏令时切换时在半夜运行,则从当前时间减去 24*60*60 秒可能会导致您在同一天或 2 天前运行。
要获取c
这些目录的累计磁盘使用情况,请替换rm -rf
为du -c
.这是否是删除它们后将回收的空间量取决于这些目录中的任何文件是否在其他地方有硬链接。