如何查找具有特定名称的最新文件?
How to find newest files with a certain name?
假设我有一个目录,其子目录中有许多同名文件(例如,在为多篇学术论文保留 BibTeX 文件时出现)。
查找具有给定名称的文件的最新版本的最佳方法是什么?
我想出了以下命令
find . -name "someFile" -exec ls -alF {} \;
列出所有名为 someFile
的文件及其日期,但不会将它们从旧到新排序。
请注意,ls
的 -t
选项不能在这里使用,因为每个文件都单独 运行。
您可以将 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 find 没有 -ls
选项。
另一个解决方案(除了 anubhava 的)是使用前引号对 find
的结果执行 ls
,这将允许您使用 -t
修饰符:
ls -alFt `find . -name "somefile"`
然后,如果你愿意这样做,你可以使用一系列cut
、rev
和head
来提取文件名:
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 {} +
显示文件的所有版本,最新的在前。
假设我有一个目录,其子目录中有许多同名文件(例如,在为多篇学术论文保留 BibTeX 文件时出现)。
查找具有给定名称的文件的最新版本的最佳方法是什么?
我想出了以下命令
find . -name "someFile" -exec ls -alF {} \;
列出所有名为 someFile
的文件及其日期,但不会将它们从旧到新排序。
请注意,ls
的 -t
选项不能在这里使用,因为每个文件都单独 运行。
您可以将 stat
与 find
一起使用:
find . -name "someFile" -exec stat -c '%n:%Y' {} + | sort -t : -k2 | cut -d : -f1
stat
命令正在打印每个文件名以及自文件修改时间的 EPOCH 值以来的时间sort
正在使用第二个键(修改时间) 对 cut
只是选择第一列(文件名)
stat
的输出进行排序
编辑: 根据下面的评论,您可以使用:
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"`
然后,如果你愿意这样做,你可以使用一系列cut
、rev
和head
来提取文件名:
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 usestat
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 {} +
显示文件的所有版本,最新的在前。