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.
所以,只需用%C
replace%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