我有一堆同一级别的目录,想根据其中内容的最后修改日期(递归)对它们进行排序。然而,在 nautilus 中,看起来目录的“最后修改日期”只有在内部创建新文件时才会更新。
是否有办法显示这些目录的递归“上次修改日期”?
编辑:我只需要知道最接近的分钟的日期。因此,我采用了 Stéphane Chazelas 的解决方案,并进行了一些小的修改以减少混乱:
find . -mindepth 2 -type f -printf '%TF %TH:%TM/%P\0' |
LC_ALL=C sort -zt/ -k2,2 -k1,1r |
LC_ALL=C sort -t/ -zmsuk2,2 |
LC_ALL=C sort -z |
cut -zd/ -f1,2 | tr '\0/' '\n\t'
答案1
目录的最后修改时间(比如电话簿, 不是文件夹) 是上次修改的时间,例如在该目录中删除、添加或编辑条目的时间。
要递归地找出其中最新的常规文件,您需要读取该目录以及每个文件中的每个目录的内容,并检查文件的修改时间。这是一件成本高昂的事情,我不希望任何文件管理器应用程序能够做到这一点。
不过,您可以编写脚本。
find
使用和sort
(以及任何类似 Bourne 的 shell)的 GNU 实现,您可以执行以下操作:
TZ=UTC0 find . -mindepth 2 -type f -printf '%TFZ%TT/%P\0' |
LC_ALL=C sort -zt/ -k2,2 -k1,1r |
LC_ALL=C sort -t/ -zmsuk2,2 |
LC_ALL=C sort -z |
tr '\0' '\n'
这会给出类似的东西:
2020-02-08Z19:17:22.3588966190/Scripts/.distfiles
2020-02-09Z09:25:37.5336986350/StartupFiles/zshrc
2020-07-26Z20:33:17.7263164070/Misc/vcs_info-examples
2020-07-26Z20:33:17.7463157170/Util/ztst-syntax.vim
2020-08-22Z18:06:17.9773156630/Functions/VCS_Info
2020-08-30Z11:11:00.5701005930/autom4te.cache/requests
2020-08-30Z11:11:31.5245491550/Config/defs.mk
2020-08-30Z11:11:31.6085449480/Etc/Makefile
2020-08-30Z11:12:10.9305773600/INSTALL.d/share/zsh/5.8.0.2-dev/help
2020-10-22Z05:17:15.3808945480/Completion/Base/Utility
2020-10-22Z05:17:15.3928938520/Doc/Zsh/zle.yo
2020-10-22Z05:17:15.3968936190/Src/zsh.h
2020-10-22Z05:17:15.3968936190/Test/D02glob.ztst
2020-10-22Z05:17:15.4168924590/.git/logs/refs/heads/master
也就是说,给出每个目录中最新的常规文件及其时间戳。不显示其中没有常规文件的目录。
要仅查看目录列表,请在命令cut -zd/ -f2 |
前插入tr
。
对于像 zsh 方法那样更漂亮的输出,您可以将tr
命令替换为:
LC_ALL=C gawk -v RS='\0' -F / '{
dir = $2; mtime = $1
sub("[^/]*/[^/]*/", "")
printf "%-20s %s (%s)\n", dir, mtime, $0}'
当我们使用 时gawk
,我们还可以将find
时间戳打印为小数 Unix 纪元时间并gawk
以本地时间重新格式化:
find . -mindepth 2 -type f -printf '%T@/%P\0' |
LC_ALL=C sort -zt/ -k2,2 -k1,1rn |
LC_ALL=C sort -t/ -zmsuk2,2 |
LC_ALL=C sort -zn |
LC_ALL=C gawk -v RS='\0' -F / '{
dir = $2; split($1, mtime, ".")
sub("[^/]*/", "")
printf "%-20s %s (%s)\n", dir, strftime("%FT%T." mtime[2] "%z", mtime[1]), $0}'
这会给出如下输出:
cross-build 2019-12-02T13:48:33.0505299150+0000 (cross-build/x86-beos.cache)
m4 2019-12-02T13:48:33.4615093990+0000 (m4/xsize.m4)
autom4te.cache 2019-12-02T13:50:48.8897482560+0000 (autom4te.cache/requests)
CWRU 2020-08-09T17:17:21.4712835520+0100 (CWRU/CWRU.chlog)
include 2020-08-09T17:17:21.5872807740+0100 (include/posixtime.h)
tests 2020-08-09T17:17:21.8392747400+0100 (tests/type.right)
.git 2020-08-09T17:17:21.8472745490+0100 (.git/index)
doc 2020-08-09T17:35:35.1638603570+0100 (doc/Makefile)
po 2020-08-09T17:35:35.3758514290+0100 (po/Makefile)
support 2020-08-09T17:35:36.7037954930+0100 (support/man2html)
lib 2020-08-09T17:35:42.3755564970+0100 (lib/readline/libhistory.a)
builtins 2020-08-09T17:35:42.5035511020+0100 (builtins/libbuiltins.a)
examples 2020-08-09T17:35:47.1513551370+0100 (examples/loadables/cut)
INSTALL.d 2020-08-09T17:35:47.3993446790+0100 (INSTALL.d/lib/bash/cut)
答案2
在 中zsh
,您可以定义一个by_age_of_newest_file
排序顺序函数,例如:
zmodload zsh/stat
typeset -A newest_mtime newest_file
by_age_of_newest_file() {
local dir=${1-$REPLY}
local newest=($dir/**/*(ND.om[1]))
if (($#newest)); then
stat -gLA REPLY -F %FZ%T.%N +mtime -- $newest
newest_mtime[$dir]=$REPLY newest_file[$dir]=$newest
else
REPLY= newest_mtime[$dir]= newest_file[$dir]=
fi
}
您可以将其用作:
print -rC1 -- *(ND/o+by_age_of_newest_file)
从最旧到最新打印列表(首先列出没有文件的目录)。替换o+
为O+
可颠倒顺序。
或者打印目录以及最新文件及其时间戳:
data=()
for dir (*(ND/o+by_age_of_newest_file))
data+=("$dir" "$newest_mtime[$dir]" "($newest_file[$dir])")
print -raC3 -- "$data[@]"
这给出了类似的东西:
Scripts 2020-02-08Z19:17:22.358896619 (Scripts/.distfiles)
StartupFiles 2020-02-09Z09:25:37.533698635 (StartupFiles/zshrc)
Misc 2020-07-26Z20:33:17.726316407 (Misc/vcs_info-examples)
Util 2020-07-26Z20:33:17.746315717 (Util/ztst-syntax.vim)
Functions 2020-08-22Z18:06:17.977315663 (Functions/VCS_Info/Backends/VCS_INFO_get_data_hg)
autom4te.cache 2020-08-30Z11:11:00.570100593 (autom4te.cache/requests)
Config 2020-08-30Z11:11:31.524549155 (Config/defs.mk)
Etc 2020-08-30Z11:11:31.608544948 (Etc/Makefile)
INSTALL.d 2020-08-30Z11:12:10.870580360 (INSTALL.d/share/zsh/5.8.0.2-dev/help/zstyle)
Completion 2020-10-22Z05:17:15.380894548 (Completion/Base/Utility/_store_cache)
Doc 2020-10-22Z05:17:15.392893852 (Doc/Zsh/zle.yo)
Src 2020-10-22Z05:17:15.396893619 (Src/zsh.h)
Test 2020-10-22Z05:17:15.396893619 (Test/D02glob.ztst)
.git 2020-10-22Z05:17:15.416892459 (.git/logs/refs/heads/master)
(请注意时间戳采用 Zulu/UTC 时间)