마지막으로 수정된 내용을 기준으로 디렉토리 정렬(재귀적으로)

마지막으로 수정된 내용을 기준으로 디렉토리 정렬(재귀적으로)

동일한 수준에 여러 개의 디렉토리가 있고 그 안에 있는 내용의 마지막 수정 날짜를 기준으로(재귀적으로) 정렬하고 싶습니다. 그러나 노틸러스에서는 디렉토리의 "마지막 수정 날짜"가 내부적으로 새 파일이 생성될 때만 업데이트되는 것처럼 보입니다.

이러한 디렉토리의 재귀적인 "마지막 수정 날짜"를 표시하는 방법이 있습니까?


편집: 날짜를 가장 가까운 분까지만 알면 됩니다. 그래서 저는 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

디렉토리의 마지막 수정 시간(예:전화 번호부, 아니요폴더)는 디렉토리에서 항목이 삭제, 추가 또는 편집된 시간과 같이 마지막으로 수정된 시간입니다.

그 안에 있는 최신 일반 파일을 재귀적으로 찾으려면 해당 디렉터리와 그 안에 있는 모든 파일의 내용을 읽고 파일의 수정 시간을 확인해야 합니다. 이는 비용이 많이 드는 작업이며 어떤 파일 관리자 앱에서도 이 작업을 수행할 수 있을 것으로 기대하지 않습니다.

그러나 스크립트를 작성할 수는 있습니다.

findsort및 Bourne과 유사한 셸의 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}'

다음을 사용하면 타임스탬프를 십진 Unix epoch 시간으로 인쇄하고 현지 시간으로 다시 형식화할 gawk수도 있습니다 .findgawk

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 시간임을 참고하세요)

관련 정보