按访问时间递归排序的列表文件+目录路径

按访问时间递归排序的列表文件+目录路径

我正在编写一个 LRU 脚本,但在处理了 20 个小时后,我遇到了无法修复的递归模式问题。

我只需要一个命令来显示按访问时间排序的文件(--time=atime);我也想控制深度,但如果我做不到,也没关系。

  • 主目录:
    • 文件1
    • 目录1:
      • 文件1
      • 文件2
      • 子目录 1 :
        • 文件1
        • 文件2
    • 目录2:
      • 文件1
      • 文件2
      • 子目录 2 :
        • 文件1
        • 文件2
        • 子目录 3 :
          • 文件1

我想排除目录,只让文件按访问时间排序

喜欢

/主目录/目录1/文件1

/主目录/文件1

/主目录/目录1/子目录1/文件2

/主目录/目录 2/子目录 2/子目录 3/文件 1

ETC..

答案1

有六种非常常用的工具可以解决类似的问题:

  • find,查找与特定条目匹配的文件或目录。

    -mindepth和选项-maxdepth控制命令在文件系统树中的深度(相对于指定的名称,其深度始终为 0)。

    -type选项对于限制对文件、目录、符号链接或设备的考虑很有用。

    -printf选项非常有用,因为它使命令以所需的格式打印出有关匹配名称(目录项)的信息。我特别喜欢%TY%Tm%Td %TT %p\n,它使用 format 打印最后一次修改的日期和时间,以及每行上每个匹配的完整路径和名称YYYYMMDD HH:MM:SS.sss PATH。您会看到,这种格式排序正确。对于最后一次访问,使用,但请注意,如果使用 mount 选项,则%AY%Am%Ad %AT %p\n根本不会记录访问时间戳,或者如果使用 mount 选项,则仅在修改后第一次访问时才修改访问时间戳;因此,最近最少使用的检查并不可靠。 (然而,最近最少修改的列表是相当可靠的;用户可以手动修改时间戳,但否则它们会自动维护。)noatimerelatime

  • sort对输出进行排序。

    -d、、和选项定义如何比较项目,并且该-g选项使顺序随机。-h-M-n-R

    -r选项可用于反转排序顺序(除了上述选项之一之外使用)。

    -t选项重新定义了字段(列)的定义方式;默认情况下,空格(空格和制表符)分隔列。

    -k选项可用于定义每行的哪一部分被视为排序键;默认情况下,考虑整行。

  • uniq通常在排序后使用,将多个连续的项目合并为一个——以便仅输出唯一的行。

  • cut是从输出中的每一行中仅选择特定列的最简单方法。

    -f选项选择要打印的字段。 (默认情况下,打印最多包含一个字段(无分隔符)的行;该选项-s禁止打印此类行。)

    -d选项可用于重新定义字段的定义;默认情况下,将单独的字段留空。

  • sed是一个强大的流编辑器,适用于常用表达对输入进行过滤并根据需要进行修改。

  • awk是 awk 语言的解释器。 awk 脚本基本上是以下集合行动,为每一行执行的代码片段(或者在所有处理之前或之后,或者如果该行(或记录)匹配某些规则)。

这个特殊问题可以在一个简单的管道中使用上述三个命令来解决:使用find在树的所需深度查找文件,打印每个文件的可排序日期和时间,以及文件的相对路径;对输出进行排序;删除每行的日期和时间部分,仅保留每行上每个文件的相对路径。

答案2

到目前为止最简单的方法是使用桀骜。它是全局限定符可以根据文件的类型、时间戳和其他属性对文件进行匹配和排序。

print -lr -- *(.Doa)
print -lr -- **/*(.Doa)

.第一个命令打印当前目录中常规文件 ( ) 的名称,包括D按访问时间 ( ) 排序的点文件 ( oa)。第二个命令递归地列出当前目录及其子目录中的文件。

相关内容