按同名包含文件的上次修改日期/时间对目录进行排序

use*_*922 4 command-line ls sort timestamps files

是否可以使用grepfind等按同名文件(例如file.php)的上次修改日期对目录列表进行排序?例如:

domain1/file.php (last modified 20-Jan-2014 00:00)
domain2/file.php (last modified 22-Jan-2014 00:00)
domain3/file.php (last modified 24-Jan-2014 00:00)
domain4/file.php (last modified 23-Jan-2014 00:00)
Run Code Online (Sandbox Code Playgroud)

每个目录具有相同的文件名(例如,file.php)。

结果应该是:

domain3/ (last modified 24-Jan-2014 00:00)
domain4/ (last modified 23-Jan-2014 00:00)
domain2/ (last modified 22-Jan-2014 00:00)
domain1/ (last modified 21-Jan-2014 00:00)
Run Code Online (Sandbox Code Playgroud)

G-M*_*ca' 5

正如 Vivian 所建议的,该-t选项ls告诉它按修改时间对文件进行排序(默认情况下是最近的;如果添加则相反-r)。这是最常用的(至少以我的经验)对目录中的文件进行排序,但它也可以应用于命令行上的文件列表。通配符(“globs”)在命令行上生成文件列表。所以,如果你说

ls -t */file.php
Run Code Online (Sandbox Code Playgroud)

它会列出

domain3/file.php  domain4/file.php  domain2/file.php  domain1/file.php
Run Code Online (Sandbox Code Playgroud)

但是,如果您添加-1(破折号)选项,或者将其通过管道传输到任何内容中,它会每行列出一个。所以你想要的命令是

ls -t */file.php | sed 's|/file.php||'
Run Code Online (Sandbox Code Playgroud)

这是 中的普通 替换,但用作分隔符,因为包含 a ,并且带有一个空。(即,它会从输出中删除文件名和之前的文件名。)当然,如果您想要目录名的结尾,只需执行或。s/old_string/replacement_string/sed|old_string/replacement_string//file.phpls/sed 's|file.php||'sed 's/file.php//'

如果需要,添加-l(小写 L)选项ls 以获取长列表,包括修改日期/时间。然后您可能希望增强sed命令以去除不相关的信息(如文件的模式、所有者和大小),并且如果需要,将日期/时间移动到目录名称之后。

这将查看当前目录的目录,并且只查看它们。(这似乎是问题所要求的。)对其他目录进行一级扫描是一个微不足道的变化:

ls -t /path/to/tld/*/file.php | sed 's|/file.php||'
Run Code Online (Sandbox Code Playgroud)

(递归地)搜索当前目录(或其他一些顶级目录)下的整个目录树有点棘手。输入命令

shopt -s globstar
Run Code Online (Sandbox Code Playgroud)

然后将*上述命令之一中的星号 ( )替换为两个星号 ( **),例如,

ls -t **/file.php | sed 's|/file.php||'
Run Code Online (Sandbox Code Playgroud)

  • 对。要搜索当前目录下的整个目录树(而不是只查看第一级),请键入 `shopt -s globstar`,然后将我的答案中的命令更改为使用 `**/file.php`(有两个星号)。 (2认同)