如何查找具有特定名称的最新文件?

How to find newest files with a certain name?

假设我有一个目录,其子目录中有许多同名文件(例如,在为多篇学术论文保留 BibTeX 文件时出现)。

查找具有给定名称的文件的最新版本的最佳方法是什么?

我想出了以下命令

find . -name "someFile" -exec ls -alF {} \;

列出所有名为 someFile 的文件及其日期,但不会将它们从旧到新排序。

请注意,ls-t 选项不能在这里使用,因为每个文件都单独 运行。

您可以将 statfind 一起使用:

find . -name "someFile" -exec stat -c '%n:%Y' {} + | sort -t : -k2 | cut -d : -f1
  • stat 命令正在打印每个文件名以及自文件修改时间的 EPOCH 值以来的时间
  • sort 正在使用第二个键(修改时间)
  • stat 的输出进行排序
  • cut 只是选择第一列(文件名)

编辑: 根据下面的评论,您可以使用:

while IFS=: read -r f t; do
    echo "$f <$(date -d @$t)>"
done < <(find . -name "someFile" -exec stat -c '%N:%Y' '{}' + | sort -t : -k2)

编辑 2: 在 Linux 系统上你可以做:

find . -name "someFile" -printf "%p:%T@\n" | sort -t : -k2

更新:

根据OP。将建议的解决方案结合起来得到以下非常干净的解决方案:

find . -name "someFile" -exec ls -latR {} +

显示文件的所有版本,最新的在前。这将需要 gnu find,因为 BSD find 没有 -ls 选项。

另一个解决方案(除了 anubhava 的)是使用前引号对 find 的结果执行 ls,这将允许您使用 -t 修饰符:

ls -alFt `find . -name "somefile"`

然后,如果你愿意这样做,你可以使用一系列cutrevhead来提取文件名:

ls -alFt `find . -name "bla.txt"` | rev | cut -d" " -f1 | rev | head -1

最近的文件(前 20 个):

find . -name someFile\* -type f -exec stat -c "%W %n" -- {} \; | sort -nr | head -n20

最旧的文件(前 20 个)

find . -name someFile\* -type f -exec stat -c "%W %n" -- {} \; | sort -n | head -n20

Note: You need to install coreutils to be able to use stat command.

您可以根据需要使用不同的时间标志:

%w   time of file birth, human-readable; - if unknown
%W   time of file birth, seconds since Epoch; 0 if unknown
%x   time of last access, human-readable
%X   time of last access, seconds since Epoch
%y   time of last modification, human-readable
%Y   time of last modification, seconds since Epoch
%z   time of last change, human-readable
%Z   time of last change, seconds since Epoch

有关更多选项,请参阅:stat --help

在 BSD/OSX 上,您必须检查不同的参数,或者从 coreutils 软件包安装 GNU stat

我一直很喜欢助记词"later"

ls -latr | grep 文件名

文件名的最新时间戳将在底部

将建议的解决方案结合起来得到以下非常干净的解决方案:

find . -name "someFile" -exec ls -latR {} +

显示文件的所有版本,最新的在前。