Files
如何遞歸地列出按修改日期排序的文件(沒有可用的 stat 命令!)
如何獲取目前目錄下所有文件的列表及其修改日期並按該日期排序?
現在我知道如何使用
find
,stat
和來實現這一點sort
,但是由於某些奇怪的原因,stat
盒子上沒有安裝它,而且我不太可能安裝它。還有其他選擇嗎?
PS:
gcc
也沒有安裝
我最短的方法使用 zsh:
print -rl -- **/*(.Om)
D
(如果您還想列出隱藏文件或隱藏目錄中的文件,請添加glob 限定符)。如果你有 GNU find,讓它列印文件修改時間並按其排序。我假設文件名中沒有換行符。
find . -type f -printf '%T@ %p\n' | sort -k 1 -n | sed 's/^[^ ]* //'
如果你有 Perl(同樣,假設文件名中沒有換行符):
find . -type f -print | perl -l -ne ' $_{$_} = -M; # store file age (mtime - now) END { $,="\n"; print sort {$_{$b} <=> $_{$a}} keys %_; # print by decreasing age }'
如果您有 Python(再次假設文件名中沒有換行符):
find . -type f -print | python -c 'import os, sys; times = {} for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime for f in sorted(times.iterkeys(), key=lambda f:times[f]): print f'
如果您對該伺服器具有 SSH 訪問權限,請通過sshfs將目錄掛載到配備更好的機器上:
mkdir mnt sshfs server:/path/to/directory mnt zsh -c 'cd mnt && print -rl **/*(.Om)' fusermount -u mnt
僅使用 POSIX 工具會復雜得多,因為沒有找到文件修改時間的好方法。檢索文件時間的唯一標準方法是
ls
,並且輸出格式取決於語言環境並且難以解析。如果您可以寫入文件,並且只關心正常文件,並且文件名中沒有換行符,那麼這是一個可怕的問題:在單個目錄中創建指向所有文件的硬連結,並按修改時間對它們進行排序。
set -ef # disable globbing IFS=' ' # split $(foo) only at newlines set -- $(find . -type f) # set positional arguments to the file names mkdir links.tmp cd links.tmp i=0 list= for f; do # hard link the files to links.tmp/0, links.tmp/1, … ln "../$f" $i i=$(($i+1)) done set +f for f in $(ls -t [0-9]*); do # for each file, in reverse mtime order: eval 'list="${'$i'} # prepend the file name to $list $list"' done printf %s "$list" # print the output rm -f [0-9]* # clean up cd .. rmdir links.tmp