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

时间:2015-03-04 18:57:02

标签: linux sorting date command-line find

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

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

我已经提出以下命令

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

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

请注意,此处-t的{​​{1}}选项无法使用,因为它是针对每个文件单独运行的。

5 个答案:

答案 0 :(得分:1)

您可以将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查找没有-ls选项。

答案 1 :(得分:0)

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

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

然后,如果您倾向于这样做,您可以使用一系列cutrevhead来提取文件名:

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

答案 2 :(得分:0)

最新文件(前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
  

注意:您需要安装coreutils才能使用stat命令。

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

%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上,您必须检查不同的参数,或者从stat包中安装GNU coreutils

答案 3 :(得分:0)

我一直很喜欢这个助记符&#34;后来&#34;

ls -latr | grep文件名

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

答案 4 :(得分:0)

结合提出的解决方案会产生以下非常干净的解决方案:

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

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