Files

如何遞歸地列出按修改日期排序的文件(沒有可用的 stat 命令!)

  • April 15, 2019

如何獲取目前目錄下所有文件的列表及其修改日期並按該日期排序?

現在我知道如何使用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

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