Answers:
使用GNU工具和rsync
,您可以执行以下操作:
export LC_ALL=C # force tools to regard those file paths as arrays
# of bytes (as they are in effect) and not do fancy
# sorting (and use English for error/warning messages
# as an undesired side effect).
find . -type f -printf '%T@/%s/%p\0' | # print mtime/size/path
sort -zn | # numerical sort, oldest first
awk -v RS='\0' -v ORS='\0' -F / -v max=50e12 '
{total_size += $2}
total_size > max {exit}
{
sub("^[^/]*/[^/]*/", "") # remove mtime/size/
print # path
}' |
rsync -nv -aHAX0 --files-from=- --remove-source-files . /dest/dir/
(未经测试。-n
用于空运行。如果需要,请删除)。
请注意,我们是根据文件大小(%s
,替换%b
为扇区中的磁盘使用量,然后更改为total_size += $2 * 512
)并忽略硬链接来计算累积文件大小。这些文件在复制到目标文件系统时会与目录一起包含它们的文件最终可能会使用超过50TB(除非正在播放文件系统压缩或重复数据删除)。
50 * 2^40
)。你也可以将其更改为total_size += $2 + overhead
其中overhead
被定义为那些文件夹中产生的开销。另请参阅%k
而不是%s
获得KiB中的磁盘使用情况。
'ls'命令在时间戳方面有些创新-解析它们可能很麻烦。用实现stat()的语言来实现它可能会容易得多。某些版本的Unix具有命令行状态 -在附近的RH盒上:
find ${BASEDIR} -type f -exec stat --format="%y %b %n" {} \; | sort | less
但是,这将像带有大量文件的狗一样运行。
GNU awk的文档包括提供文件系统功能的示例扩展,但是您需要做一些工作来构建和维护它。
从头开始用PHP,C或Perl(或go,ruby或许多其他语言)编写程序将很简单,但超出了本文的讨论范围。
stat
是在GNU find
拥有-printf
命令之后添加的(很可能stat
与具有更好接口的GNU一样)。
total_size > max { exit 0 }
在awk脚本中添加了一个)