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

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

如何获取当前目录下所有文件的列表及其修改日期并按该日期排序?

现在我知道如何使用find,stat和来实现这一点sort,但由于某种奇怪的原因,它stat没有安装在盒子上,我不太可能安装它。

还有其他选择吗?

PS:gcc也没有安装

答案1

我的最短方法使用 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

答案2

假设 GNU find

find . -printf '%T@ %c %p\n' | sort -k 1n,1 -k 7 | cut -d' ' -f2-

如果您希望首先列出最近的文件,请更改1n,1为。1nr,1

如果您没有 GNU,find这会变得更加困难,因为ls的时间戳格式变化很大(例如,最近修改的文件具有不同样式的时间戳)。

答案3

在 Mac 上,没有 -printf 参数可供查找,但您可以这样做:

find . -print0 | xargs -0 -n 100 stat -f"%m %Sm %N" | sort -n|awk '{$1="";print}'

答案4

一般来说,按日期查找文件(这不适用于原始海报,但我最终来到这里,所以我认为其他人也可以)。在我的用例中,我想列出这些文件,以便在删除之前进行检查。

使用 findutils 4.6.0 我喜欢:

find . -type f -mtime +270 -exec ls -laFGht --time-style=iso {} \+

上面的命令查找-type f当前工作目录 ( .) 中超过 270 天前修改的文件 ( )(-mtime +270还将-mtime 0生成最近 24 小时,并-mtime -5显示最近 5 天)。然后它ls按日期列出它们,最新的在前 ( -exec ls -laFGht --time-style=iso {} \+)

以下是输出示例:

-rwxrwx---+ 1 user1 208M 2018-07-16  ./filename.bak*
-rwxrwx---+ 1 user1  702 2018-07-15  ./filename.ldf*
-rwxrwx---+ 1 user1 208M 2018-07-15  ./filename.bak*

这样做的好处是,一旦列表被审查,用find删除命令替换列表部分就很简单了:

find . -type f -mtime +270 -delete

相关内容