Linux:目录中的最新文件

寻找一个将返回目录中最新的单个文件的命令。

没有看到一个限制参数…

 ls -Art | tail -n 1 

不是很优雅,但它的作品。

 ls -t | head -n1 

这个命令实际上给出了当前工作目录下最新的修改文件。

这是一个recursion的版本(即它find某个目录或其任何子目录中最近更新的文件)

 find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1 

编辑:使用-f 2-而不是按Kevin所build议的-f 2

我用:

ls -ABrt1 --group-directories-first | tail -n1

它给我只是文件名,不包括文件夹。

ls -lAtr | tail -1

其他解决scheme不包括以'.'开头的文件'.'

这个命令也会包含'.''..' ,这可能是也可能不是你想要的:

ls -latr | tail -1

我喜欢echo *(om[1])zsh语法),因为它只是给出文件名,不会调用任何其他命令。

基于dmckee的答案的短缺变体:

 ls -t | head -1 

我个人更喜欢使用尽可能less的内置bash命令(以减less昂贵的fork和exec系统调用的数量)。 按datesorting需要调用ls 。 但是使用head并不是真的有必要。 我使用下面的一行代码(仅在支持名称pipe道的系统上工作):

 read newest < <(ls -t *.log) 

或者获取最旧的文件的名称

 read oldest < <(ls -rt *.log) 

(注意两个'<'标记之间的空格!)

如果还需要隐藏文件 – 可以添加一个arg。

我希望这可以帮助。

查找/sorting解决scheme很好,直到文件数量变得非常大(如整个文件系统)。 使用awk来代替最新的文件:

 find $DIR -type f -printf "%T@ %p\n" | awk ' BEGIN { recent = 0; file = "" } { if ($1 > recent) { recent = $1; file = $0; } } END { print file; }' | sed 's/^[0-9]*\.[0-9]* //' 
 ls -t -1 | sed '1q' 

将显示文件夹中最后一个修改的项目。 与grep配对以查找带有关键字的最新条目

 ls -t -1 | grep foo | sed '1q' 

试试这个简单的命令

 ls -ltq <path> | head -n 1 

如果你想要文件名 – 最后修改,path= /ab/cd/*.log

如果你想要目录名称 – 最后修改,path= / ab / cd / * /

recursion:

 find $1 -type f -exec stat --format '%Y :%y %n' "{}" \; | sort -nr | cut -d: -f2- | head 

所有这些ls / tail解决scheme对目录中文件都能很好地工作 – 忽略子目录。

为了在search中包含所有文件(recursion),可以使用find。 gioelebuild议对格式化的查找输出进行sorting。 但要小心空格(他的build议不适用于空格)。

这应该适用于所有文件名称:

 find $DIR -type f -printf "%T@ %p\n" | sort -n | sed -r 's/^[0-9.]+\s+//' | tail -n 1 | xargs -I{} ls -l "{}" 

这样sorting,看到男人发现:

 %Ak File's last access time in the format specified by k, which is either `@' or a directive for the C `strftime' function. The possible values for k are listed below; some of them might not be available on all systems, due to differences in `strftime' between systems. @ seconds since Jan. 1, 1970, 00:00 GMT, with fractional part. %Ck File's last status change time in the format specified by k, which is the same as for %A. %Tk File's last modification time in the format specified by k, which is the same as for %A. 

所以,只需用%Creplace%T即可按ctimesorting。

根据模式在每个目录中查找最新的文件,例如工作目录的名称以“tmp”结尾的子目录(不区分大小写):

 find . -iname \*tmp -type d -exec sh -c "ls -lArt {} | tail -n 1" \; 

关于可靠性的说明:

由于换行字符与文件名中的任何字符一样有效,任何依赖于基于head / tail行的解决scheme都是有缺陷的。

使用GNU ls ,另一种select是使用--quoting-style=shell-always选项和一个bash数组:

 eval "files=($(ls -t --quoting-style=shell-always))" ((${#files[@]} > 0)) && printf '%s\n' "${files[0]}" 

(如果您还想考虑隐藏文件,请添加-A )。

如果你想限制到普通的文件(无视目录,fifos,设备,符号链接,套接字…),你需要求助于GNU find

用bash 4.4或更新版本(对于readarray -d )和GNU coreutils 8.25或更新版本(对于cut -z ):

 readarray -t -d '' < <( LC_ALL=C find . -maxdepth 1 -type f ! -name '.*' -printf '%T@/%f\0' | sort -rzn | cut -zd/ -f2) ((${#files[@]} > 0)) && printf '%s\n' "${files[0]}" 

或者recursion地:

 readarray -t -d '' < <( LC_ALL=C find . -name . -o -name '.*' -prune -o -type f -printf '%T@%p\0' | sort -rzn | cut -zd/ -f2-) 

最好在这里使用zsh和它的glob修饰符而不是bash来避免所有这些麻烦:

当前目录中的最新常规文件:

 printf '%s\n' *(.om[1]) 

包括隐藏的:

 printf '%s\n' *(D.om[1]) 

第二最新:

 printf '%s\n' *(.om[2]) 

检查符号链接parsing后的文件年龄:

 printf '%s\n' *(-.om[1]) 

recursion:

 printf '%s\n' **/*(.om[1]) 

另外,启用完成系统( compinit和co)后, Ctrl + X m将成为一个扩展到最新文件的完成程序。

所以:

  vi Ctrl + X m 

会让你编辑最新的文件(你也有机会看到它之前,你按Return )。

  vi Alt + 2 Ctrl + X m 

对于第二个最新的文件。

  vi * .c Ctrl + X m 

为最新的c文件。

  vi *(。) Ctrl + X m 

对于最新的普通文件(不是目录,也不是fifo / device …),等等。

我也需要这样做,我发现了这些命令。 这些为我工作:

如果您想要在文件夹中创builddate的最后一个文件(访问时间):

 ls -Aru | tail -n 1 

如果你想要最后一个内容有变化的文件(修改时间):

 ls -Art | tail -n 1