在进行递归调用时,ls似乎没有正确地对文件进行排序:
ls -altR . | head -n 3
如何在目录(包括子目录)中找到最近修改的文件?
在进行递归调用时,ls似乎没有正确地对文件进行排序:
ls -altR . | head -n 3
如何在目录(包括子目录)中找到最近修改的文件?
当前回答
查询/target_directory目录下的所有子目录下,在过去60分钟内被修改过的文件。
$ find /target_directory -type f -mmin -60
要查找最近修改的文件,按更新时间的相反顺序排序(即,最近更新的文件在前面):
$ find /etc -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r
其他回答
我费了好大劲才找到Solaris 10下最后一个修改过的文件。find没有printf选项,stat不可用。我发现下面这个方法对我来说很管用:
find . -type f | sed 's/.*/"&"/' | xargs ls -E | awk '{ print $6," ",$7 }' | sort | tail -1
要显示文件名,请使用
find . -type f | sed 's/.*/"&"/' | xargs ls -E | awk '{ print $6," ",$7," ",$9 }' | sort | tail -1
解释
找到。-type f查找并列出所有文件 sed的s /。*/"&"/'将路径名用引号括起来以处理空白 xargs ls -E将带引号的路径发送到ls, -E选项确保返回完整的时间戳(格式为年-月-日小时-分-秒-纳秒) Awk '{print $6," ",$7}'只提取日期和时间 Awk '{print $6," ",$7," ",$9}'提取日期,时间和文件名 Sort返回按日期排序的文件 Tail -1只返回最后修改的文件
我也遇到过同样的问题。我需要递归地找到最近的文件。花了大约50分钟才找到。
这里有一个小脚本来更快地完成它:
#!/bin/sh
CURRENT_DIR='.'
zob () {
FILE=$(ls -Art1 ${CURRENT_DIR} | tail -n 1)
if [ ! -f ${FILE} ]; then
CURRENT_DIR="${CURRENT_DIR}/${FILE}"
zob
fi
echo $FILE
exit
}
zob
它是一个递归函数,获取目录中最近修改的项。如果该项是一个目录,则递归调用该函数并搜索该目录,等等。
find . -type f -printf '%T@ %p\n' \
| sort -n | tail -1 | cut -f2- -d" "
对于一棵巨大的树,排序可能很难把所有东西都保存在内存中。
%T@像unix时间戳一样给出修改时间,sort -n按数字排序,tail -1取最后一行(最高时间戳),cut -f2 -d" "从输出中删除第一个字段(时间戳)。
编辑:就像-printf可能只在gnu中使用一样,ajreal中stat -c的使用也是如此。虽然在BSD上也可以做同样的事情,但格式化的选项是不同的(-f "%m %N"似乎是这样)
我错过了复数的部分;如果你想要更多的最新文件,只需要增加tail参数。
我发现上面的命令很有用,但对于我的情况,我需要查看文件的日期和时间,我有一个问题,几个文件的名称中有空格。 这是我的工作解决方案。
find . -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" " | sed 's/.*/"&"/' | xargs ls -l
下面的命令在Solaris上运行:
find . -name "*zip" -type f | xargs ls -ltr | tail -1