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

时间:2012-01-20 23:12:10

标签: ruby bash

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

ls -R

获取所有文件,有一些烦人的格式,我更喜欢逐行。但是,我的* nix-foo非常弱,我不确定如何按创建日期订购。

最终这将在Ruby脚本中完成,所以如果使用魔法bash命令无法实现,那么一些Ruby代码就可以了;我只是觉得使用bash可能很有趣并且可能更干净。

4 个答案:

答案 0 :(得分:1)

Dir['**/*'].reject { |f| File.directory?(f) }.sort_by { |f| File.ctime(f) }

答案 1 :(得分:1)

为此目的,我通常使用

find . -type f -print0 | xargs -0 ls -ltrh

您可以为ls提供所需的所有格式参数。

另请参阅:http://en.wikipedia.org/wiki/Xargs

答案 2 :(得分:1)

不幸的是,Linux不存储创建日期。 Mac OS可以,但它不是便携式,易读的格式。 Windows是唯一存储它的系统,但Ruby没有任何可以访问它的内部命令。

仔细阅读Ruby ctime,这经常被误读,表明它只支持“改变”时间。以下是来自ctimeFile的{​​{1}}的文档:

  

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

答案 3 :(得分:0)

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。有很多参数可用于按照您需要的任何方式格式化列表。

我注意到你说'他们想要订购它们是'#39;。 Unix有三个存储文件的时间戳,不包括创建时间,所以你可以使用显示信息

%A  File's  last  access time
%C  File's  last  status change time
%T  File's last modification time

人们通常认为%C必须意味着创造时间,但正如你所看到的那样,它的状态是更改时间',我认为这是上次任何文件权限已经改变。因此,对于可能是文件创建时间的情况,但它没有保证。 (SP)。

联机帮助页并不表示因为Windows存储了创建时间,所以您可以使用find获取它。任何人吗?

我希望这会有所帮助。