操作系统:Linux
文件系统类型:ext3
首选解决方案:bash(script / oneliner),ruby,python
我有几个目录,其中包含几个子目录和文件。 我需要列出所有这些目录,这些目录的构造方式使得每个第一级目录都列在其中最新创建/修改的文件的日期和时间旁边。
为了澄清,如果我触摸文件或将其内容修改为几个子目录级别,那么该时间戳应该显示在第一级目录名称旁边。 假设我有一个像这样结构化的目录:
./alfa/beta/gamma/example.txt
我修改了文件example.txt
的内容,我需要在人类可读形式的第一级目录alfa
旁边显示的时间,而不是epoch。 我已经尝试了一些使用find, xargs
, sort
等的东西,但是当我创建/修改几个级别的文件时,我无法解决“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
您还可以将自己的日期/时间格式指定为第三个参数。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3165869