查找文件系统中最旧的文件/目录,最大容量为50 TB


8

我需要在最多50 TB的90 TB文件系统中找到最旧的文件及其关联的目录,然后将它们移动到另一个文件系统。他们必须保留其目录结构,因为目录结构可以识别文件。所以-

一级/二级/三级/(文件)

是结构。我需要移动整个结构-顶级目录中没有任何内容,但是没有它们,我将无法识别文件所属的文件,因为我要查找的所有文件都具有相同的名称。该过程完成后,我应该在原始文件系统中剩下大约40 TB,而在新文件系统中几乎没有任何内容,因为原始文件中最旧的文件现在已经存在。

谢谢!

Answers:


9

使用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(除非正在播放文件系统压缩或重复数据删除)。


1
比我的答案更好的答案(尽管我已经total_size > max { exit 0 }在awk脚本中添加了一个)
symcbean

@symcbean,好点!我现在添加了。谢谢。
斯特凡Chazelas

看起来很棒!但是有一个问题-我假设awk语句的“ max = 50e12”部分指示系统我们想要50 TB,因此如果需要,可以基于额外的文件夹(每个文件有两个),我可以减少“ 50”到“ 49”,等于49 TB?
J Telep

1
@JTelep,这是科学计数法。50e12是10乘以12的乘方的50乘以50TB(不是您需要的50TiB 50 * 2^40)。你也可以将其更改为total_size += $2 + overhead其中overhead被定义为那些文件夹中产生的开销。另请参阅%k而不是%s获得KiB中的磁盘使用情况。
斯特凡Chazelas

2

'ls'命令在时间戳方面有些创新-解析它们可能很麻烦。用实现stat()的语言来实现它可能会容易得多。某些版本的Unix具有命令行状态 -在附近的RH盒上:

 find ${BASEDIR} -type f -exec stat --format="%y %b %n" {} \; | sort | less

但是,这将像带有大量文件的狗一样运行。

GNU awk的文档包括提供文件系统功能的示例扩展,但是您需要做一些工作来构建和维护它。

从头开始用PHP,C或Perl(或go,ruby或许多其他语言)编写程序将很简单,但超出了本文的讨论范围。


1
请注意,GNU stat是在GNU find拥有-printf命令之后添加的(很可能stat与具有更好接口的GNU一样)。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.