在上次修改的文件中搜索工作目录和子目录

时间:2016-06-08 20:27:42

标签: bash unix

我使用ls -t * | head -n1(在OS X bash shell中)来识​​别工作目录中最近修改过的文件。如何编写命令以遍历子目录?我正在寻找的是工作目录中任何地方的最后修改过的文件,包括在子目录中。

帖子How can I list (ls) the 5 last modified files in a directory?和其他类似帖子没有解决子目录的迭代问题 - 这是我在这里要解决的具体问题。

3 个答案:

答案 0 :(得分:0)

尝试ls -ltR --time-style=+%s DIRECTORY_HERE/ | grep -oP " [0-9]{10}[ ].*$" | sort -r | cut -c 13- | head -n1

打破它,命令说:

  1. ls -ltR --time-style=+%s DIRECTORY_HERE/
  2. 递归列出所有文件和文件夹,以及时间和其他信息。将时间列为UNIX时间戳。

    1. grep -oP " [0-9]{10}[ ].*$"
    2. 将结果输入grep,并使grep匹配并仅打印文件名和UNIX时间戳。请注意,这不适用于具有10个连续数字的文件名

      1. sort -r
      2. 反向排序文件列表。由于UNIX时间戳是每一行的第一部分,因此它将首先排序最近。

        1. cut -c 13-
        2. 仅保留文件名(剪下时间戳和换行符)。

          1. head -n1
          2. 打印第一个(最近的)文件名

答案 1 :(得分:0)

为什么不find

find -printf "%T@ %p\n" | sort -n | tail -1
  • 查找当前目录和子目录中的所有文件,并为每个文件打印两个字段

    %T@文件的最后修改时间(以秒为单位),小数部分

    %p文件名

  • 第一个字段的数字排序

  • 最后一条记录将是最新修改的文​​件。

答案 2 :(得分:0)

您可能希望使用ls -ltr通过修改 t ime以 r 的顺序列出文件( l ong列表格式)和tail -1仅打印最后一行输出。

ls -ltr | tail -1

ls -1tr只打印一列输出。

ls -1tr | tail -1

我建议使用r选项(即"按相反顺序")因为如果要列出大量文件,则最有可能希望在底部看到最近修改过的文件而不是在屏幕的顶部。

在当前工作目录中递归搜索:

find . -maxdepth 1 -type d -exec ls -ltr {} +

或只是

ls -lrtR

仅获取目录名称和最近修改过的文件:

find . maxdepth 1 -type d | while read PATH; do
    printf "%s: %s\n" ${PATH} $(ls -1tr | tail -1)
done