在进行递归调用时,ls似乎没有正确地对文件进行排序:

ls -altR . | head -n 3

如何在目录(包括子目录)中找到最近修改的文件?


当前回答

下面的命令在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

它是一个递归函数,获取目录中最近修改的项。如果该项是一个目录,则递归调用该函数并搜索该目录,等等。

查询/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只返回最后修改的文件

我更喜欢这个,它更短:

find . -type f -print0|xargs -0 ls -drt|tail -n 1

在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。