是否可以使用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)
每个目录都有相同的文件名(例如,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)
答案1
正如 Vivian 所建议的,-t
选项ls
告诉它按修改时间对文件进行排序(默认情况下,最近的排在前面;如果添加 则相反-r
)。这是最常用的(至少根据我的经验)对目录中的文件进行排序,但它也可以应用于命令行上的文件列表。通配符(“glob”)在命令行上生成文件列表。所以,如果你说
ls -t */file.php
它会列出
domain3/file.php domain4/file.php domain2/file.php domain1/file.php
但是,如果您添加-1
(dash one) 选项,或者将其通过管道传输到任何内容中,它将每行列出一个。所以你想要的命令是
ls -t */file.php | sed 's|/file.php||'
这是中的普通 替换,但用作分隔符,因为s/old_string/replacement_string/
sed
|
old_string
包含 a /
,并且带有一个空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||'
(递归地)搜索当前目录(或其他一些顶级目录)下的整个目录树有点棘手。输入命令
shopt -s globstar
然后将*
上述命令之一中的星号 ( ) 替换为两个星号 ( **
),例如,
ls -t **/file.php | sed 's|/file.php||'
答案2
是的,这很有可能。
这将为您提供过去 60 分钟内修改的文件:
$ find /domain -type f -mmin -60
或者这将为您提供按修改时间排序的文件。
$ find /domain -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r
编辑#1
如果您的文件扩展名为“.php”,请添加以下内容:
-name '*.php'
我发现这你可能想看看。
编辑#2
好吧,你的最后一次编辑让事情变得更加困难。但是您可以使用ls -t
上次修改的目录,如果您想按时间排序,ls -clRt
您可以使用它,之后您可以检查文件,但我不确定您想要什么可以使用任何特定命令。使用类似的脚本(Bash 或 Perl)是可能的。
答案3
答案4
和zsh
:
setopt extendedglob
print -rl -- **/file.php(.om:h)
.om
对所选文件进行排序mtime
并:h
删除尾随路径部分。
如果你也想列出mtime
s,你可以使用zstat
:
zmodload zsh/stat
for f (**/file.php(.om))
printf '%s %s\t%s\n' $(zstat -F '%d-%b-%Y %T' +mtime -- $f) ${f:h}