Ruby 如何按创建顺序递归列出目录中的文件?

Ruby 如何按创建顺序递归列出目录中的文件?,ruby,bash,Ruby,Bash,我想按创建顺序列出所有文件,而不是目录。我试过: ls -R 它得到了所有的文件,带有一些恼人的格式,我更喜欢一行一行的。然而,我的*nix-foo非常弱,我不确定如何按创建日期订购 最终,这将在Ruby脚本中完成,因此,如果无法使用神奇的bash命令,那么一些Ruby代码就可以了;我只是觉得使用bash可能会很有趣,也可能更干净 GNU-find可以帮助您,请先试试这个 Dir['**/*'].reject { |f| File.directory?(f) }.sort_by { |f| F

我想按创建顺序列出所有文件,而不是目录。我试过:

ls -R
它得到了所有的文件,带有一些恼人的格式,我更喜欢一行一行的。然而,我的*nix-foo非常弱,我不确定如何按创建日期订购


最终,这将在Ruby脚本中完成,因此,如果无法使用神奇的bash命令,那么一些Ruby代码就可以了;我只是觉得使用bash可能会很有趣,也可能更干净

GNU-find可以帮助您,请先试试这个

Dir['**/*'].reject { |f| File.directory?(f) }.sort_by { |f| File.ctime(f) }
 find . -type f -printf "%C+\t%M\t%p\n" | sed 's/+/ /' | sort -t" " +0 -1
这可能有用

但是,我正在使用

find (GNU findutils) 4.4.2
我无法让
%C+
的东西工作

所以我提出了一个长的printf格式字符串,作为一个额外的好处,它不需要sed后处理

find .  -type f -printf '%CY-%Cm-%Cd.%CH%CM%CS\t%M\t%p\n'  | sort +0 -1n
这使得输出像

2011-03-30.141038.0000000000    -rw-r--r--      ./pkgs/libxml2/libxml2-22011-03-30.140959.0000000000    -rwxr-xr-x      ./pkgs/libxml2/libxml2-2.7.7/doc/examples/.libs/reader3.exe
2011-03-30.141001.0000000000    -rwxr-xr-x      ./pkgs/libxml2/libxml2-2.7.7/doc/examples/.libs/reader3_ltshwrapper
2011-03-30.141001.0000000000    -rwxr-xr-x      ./pkgs/libxml2/libxml2-2.7.7/doc/examples/reader3.exe
2011-03-30.141002.0000000000    -rw-r--r--      ./pkgs/libxml2/libxml2-2.7.7/doc/examples/.deps/tree2.Po
2011-03-30.141002.0000000000    -rw-r--r--      ./pkgs/libxml2/libxml2-2.7.7/doc/examples/tree2.o
每个时间戳上的尾随
.0000000000
是分数秒,显然我的系统没有记录。您可以使用
%TX
获取HH:MM:SS格式

如果您需要文件列表中的其他字段(我额外添加了权限),请执行
man-find
,然后搜索
-printf
。有很多参数可用于格式化列表,只要您需要

我注意到你说“想要他们被创造的顺序”。Unix为文件存储了三个时间戳,其中不包括创建时间,因此您可以将显示信息用作

%A  File's  last  access time
%C  File's  last  status change time
%T  File's last modification time
人们通常认为%C一定是指创建时间,但正如您在上一篇文章中看到的,它是“状态更改时间”,我认为这是最后一次更改任何文件权限。因此,对于可能的情况,这将是文件创建时间,但不保证。(sp)

手册页没有指出,因为Windows存储创建时间,所以您可以使用
find
获取它。有人吗


我希望这有帮助。

GNU find可以帮助您,请先尝试一下

 find . -type f -printf "%C+\t%M\t%p\n" | sed 's/+/ /' | sort -t" " +0 -1
这可能有用

但是,我正在使用

find (GNU findutils) 4.4.2
我无法让
%C+
的东西工作

所以我提出了一个长的printf格式字符串,作为一个额外的好处,它不需要sed后处理

find .  -type f -printf '%CY-%Cm-%Cd.%CH%CM%CS\t%M\t%p\n'  | sort +0 -1n
这使得输出像

2011-03-30.141038.0000000000    -rw-r--r--      ./pkgs/libxml2/libxml2-22011-03-30.140959.0000000000    -rwxr-xr-x      ./pkgs/libxml2/libxml2-2.7.7/doc/examples/.libs/reader3.exe
2011-03-30.141001.0000000000    -rwxr-xr-x      ./pkgs/libxml2/libxml2-2.7.7/doc/examples/.libs/reader3_ltshwrapper
2011-03-30.141001.0000000000    -rwxr-xr-x      ./pkgs/libxml2/libxml2-2.7.7/doc/examples/reader3.exe
2011-03-30.141002.0000000000    -rw-r--r--      ./pkgs/libxml2/libxml2-2.7.7/doc/examples/.deps/tree2.Po
2011-03-30.141002.0000000000    -rw-r--r--      ./pkgs/libxml2/libxml2-2.7.7/doc/examples/tree2.o
每个时间戳上的尾随
.0000000000
是分数秒,显然我的系统没有记录。您可以使用
%TX
获取HH:MM:SS格式

如果您需要文件列表中的其他字段(我额外添加了权限),请执行
man-find
,然后搜索
-printf
。有很多参数可用于格式化列表,只要您需要

我注意到你说“想要他们被创造的顺序”。Unix为文件存储了三个时间戳,其中不包括创建时间,因此您可以将显示信息用作

%A  File's  last  access time
%C  File's  last  status change time
%T  File's last modification time
人们通常认为%C一定是指创建时间,但正如您在上一篇文章中看到的,它是“状态更改时间”,我认为这是最后一次更改任何文件权限。因此,对于可能的情况,这将是文件创建时间,但不保证。(sp)

手册页没有指出,因为Windows存储创建时间,所以您可以使用
find
获取它。有人吗


我希望这有帮助。

为此,我通常使用

find . -type f -print0 | xargs -0 ls -ltrh
您可以为ls提供所需的所有格式参数


另请参见:

为此,我通常使用

find . -type f -print0 | xargs -0 ls -ltrh
您可以为ls提供所需的所有格式参数


另请参见:

不幸的是,Linux没有存储创建日期。Mac OS有,但它不是一种可移植的、易于阅读的格式。Windows是唯一一个存储它的系统,但是Ruby没有任何允许您访问它的内在命令

仔细阅读Ruby的
ctime
(经常被误读),可以发现它只支持“更改”时间。以下是
File
File::Stat
中的
ctime
文档:

返回文件的更改时间(即时间目录 有关文件的信息已更改,而不是文件本身)


不幸的是,Linux没有存储创建日期。Mac OS有,但它不是一种可移植的、易于阅读的格式。Windows是唯一一个存储它的系统,但是Ruby没有任何允许您访问它的内在命令

仔细阅读Ruby的
ctime
(经常被误读),可以发现它只支持“更改”时间。以下是
File
File::Stat
中的
ctime
文档:

返回文件的更改时间(即时间目录 有关文件的信息已更改,而不是文件本身)


ls-Rt-see[bash list files by last edited date][1][1]:差不多,但我想要创建它们的顺序,而不是编辑日期ls-Rt-see[bash list files by last edited date][1][1]:差不多,但我想要创建它们的顺序,而不是编辑date@qui,下面是一个堆栈溢出的例子,讨论Linux的问题。替换结果页面搜索框中选择的操作系统。@qui,下面是一个堆栈溢出的例子,讨论Linux的问题。替换结果页面搜索框中选择的操作系统。