在进行递归调用时,ls似乎没有正确地对文件进行排序:
ls -altR . | head -n 3
如何在目录(包括子目录)中找到最近修改的文件?
在进行递归调用时,ls似乎没有正确地对文件进行排序:
ls -altR . | head -n 3
如何在目录(包括子目录)中找到最近修改的文件?
当前回答
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 -print0|xargs -0 ls -drt|tail -n 1
下面的命令在Solaris上运行:
find . -name "*zip" -type f | xargs ls -ltr | 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
它是一个递归函数,获取目录中最近修改的项。如果该项是一个目录,则递归调用该函数并搜索该目录,等等。
接着@plundra的回答,下面是BSD和OS X版本:
find . -type f -print0 \
| xargs -0 stat -f "%m %N" \
| sort -rn | head -1 | cut -f2- -d" "
在Ubuntu 13上,下面的程序可以做到这一点,可能更快一点,因为它颠倒了排序,使用'head'而不是'tail',减少了工作量。使用实例显示树中最新的11个文件。
找到。类型f printf“% T@ % p \ n”排序- n - r | |头-11 | - f2 - - d”“| sed - e ' s ^。/,,' | xargs ls -U -l
这给出了一个完整的ls列表,没有重新排序,并省略了恼人的'。'find'会显示每个文件名。
或者,作为bash函数:
treecent () {
local numl
if [[ 0 -eq $# ]] ; then
numl=11 # Or whatever default you want.
else
numl=$1
fi
find . -type f -printf '%T@ %p\n' | sort -n -r | head -${numl} | cut -f2- -d" " | sed -e 's,^\./,,' | xargs ls -U -l
}
尽管如此,大部分工作还是由plundra最初的解决方案完成的。谢谢plundra。