如何递归查找和列出具有子目录和时间的目录中的最新修改文件?

六眼飞鱼酱① 提交于 2020-02-27 08:14:36
  • 操作系统:Linux

  • 文件系统类型:ext3

  • 首选解决方案:bash(script / oneliner),ruby,python

我有几个目录,其中包含几个子目录和文件。 我需要列出所有这些目录,这些目录的构造方式使得每个第一级目录都列在其中最新创建/修改的文件的日期和时间旁边。

为了澄清,如果我触摸文件或将其内容修改为几个子目录级别,那么该时间戳应该显示在第一级目录名称旁边。 假设我有一个像这样结构化的目录:

./alfa/beta/gamma/example.txt

我修改了文件example.txt的内容,我需要在人类可读形式的第一级目录alfa旁边显示的时间,而不是epoch。 我已经尝试了一些使用find, xargssort等的东西,但是当我创建/修改几个级别的文件时,我无法解决“alfa”的文件系统时间戳没有改变的问题。


#1楼

这也可以通过bash中的递归函数来完成

设F显示文件的时间,该文件的时间必须按字典顺序排序yyyy-mm-dd等,(os依赖?)

F(){ stat --format %y "$1";}                # Linux
F(){ ls -E "$1"|awk '{print$6" "$7}';}      # SunOS: maybe this could be done easier

R遍历目录的递归函数

R(){ local f;for f in "$1"/*;do [ -d "$f" ]&&R $f||F "$f";done;}

最后

for f in *;do [ -d "$f" ]&&echo `R "$f"|sort|tail -1`" $f";done

#2楼

我正在显示最新的访问时间,你可以轻松地修改它来做最新的mod时间。

有两种方法可以做到这一点:


1)如果你想避免全局排序,如果你有数千万个文件可能会很昂贵,那么你可以这样做:(将你自己置于你希望搜索开始的目录的根目录中)

linux> touch -d @0 /tmp/a;
linux> find . -type f -exec tcsh -f -c test `stat --printf="%X" {}` -gt  `stat --printf="%X" /tmp/a`  ; -exec tcsh -f -c touch -a -r {} /tmp/a ; -print 

上述方法打印文件名的访问时间越来越长,打印的最后一个文件是具有最新访问时间的文件。 显然,您可以使用“tail -1”获取最新的访问时间。


2)您可以找到递归打印名称,访问子目录中所有文件的时间,然后根据访问时间和尾部排序最大的条目:

linux> \find . -type f -exec stat --printf="%X  %n\n" {} \; | \sort -n | tail -1

你有它......


#3楼

GNU Find(参见man find )有一个-printf参数,用于显示文件EPOC mtime和相对路径名。

redhat> find . -type f -printf '%T@ %P\n' | sort -n | awk '{print $2}'

#4楼

要在N分钟前找到上次更改文件状态的所有文件:

find -cmin -N

例如:

find -cmin -5


#5楼

快速bash功能:

# findLatestModifiedFiles(directory, [max=10, [format="%Td %Tb %TY, %TT"]])
function findLatestModifiedFiles() {
    local d="${1:-.}"
    local m="${2:-10}"
    local f="${3:-%Td %Tb %TY, %TT}"

    find "$d" -type f -printf "%T@ :$f %p\n" | sort -nr | cut -d: -f2- | head -n"$m"
}

在目录中查找最新修改的文​​件:

findLatestModifiedFiles "/home/jason/" 1

您还可以将自己的日期/时间格式指定为第三个参数。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!