use*_*922 4 command-line ls sort timestamps files
是否可以使用grep
、find
等按同名文件(例如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)
正如 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.php
ls
/
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)