假设我在子目录中有一个包含许多同名文件的目录(例如,在为多篇学术论文保留BibTeX文件时出现)。
找到具有指定名称的文件的最新版本的最佳方法是什么?
我已经提出以下命令
find . -name "someFile" -exec ls -alF {} \;
列出名为someFile
的所有文件及其日期,但不会将它们从旧到新排序。
请注意,此处-t
的{{1}}选项无法使用,因为它是针对每个文件单独运行的。
答案 0 :(得分:1)
您可以将stat
与find
:
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"`
然后,如果您倾向于这样做,您可以使用一系列cut
,rev
和head
来提取文件名:
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 {} +
显示该文件的所有版本,最新版本。