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

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

是否可以使用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)

每个目录都有相同的文件名(例如,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.phpls/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

这几乎完全符合您的要求,只是它省略了目录名称中的尾随 / 。

find . -maxdepth 2 -name file1.php -printf '%T@ %h (last modified %Td/%Tm/%TY %Tk:%TM)\n' \
| sort -k 1n | sed 's/^[^ ]* .\///'

该信用的地方就信用。这是改编自谢尔克的回答这里

编辑:我所有的 %A 都应该是 %T

答案4

zsh

setopt extendedglob
print -rl -- **/file.php(.om:h)

.om对所选文件进行排序mtime:h删除尾随路径部分。
如果你也想列出mtimes,你可以使用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}

相关内容