Bash

按最後修改的內容對目錄進行排序(遞歸)

  • October 23, 2020

我有一堆相同級別的目錄,並希望根據其中內容(遞歸)的最後修改日期對它們進行排序。但是,在 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'

目錄的最後修改時間(想像電話目錄,而不是文件夾)是它最後修改的時間,例如在該目錄中刪除、添加或編輯條目的時間。

要在其中遞歸查找最新的正常文件,您需要讀取該目錄的內容以及每個文件中的每個目錄,檢查文件的修改時間。這是一件代價高昂的事情,我不希望任何文件管理器應用程序都能做到這一點。

但是,您可以編寫腳本。

find使用and的 GNU 實現sort(以及任何類似 Bourne 的 shell),您可以執行以下操作:

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 |前插入 a。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)

引用自:https://unix.stackexchange.com/questions/615779