在高达 50 TB 的文件系统中查找最旧的文件/目录

在高达 50 TB 的文件系统中查找最旧的文件/目录

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

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

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

谢谢!

答案1

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

答案2

“ls”命令在时间戳方面有些创意 - 因此解析它们可能会很痛苦。用一种实现了以下功能的语言来实现这一点可能会容易得多统计数据()。某些版本的 Unix 有一个命令行统计- 在附近的 RH 盒子上:

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

但这会像狗一样带着大量文件运行。

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

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

相关内容