dmc*_*kee 227
ls -Art | tail -n 1
Run Code Online (Sandbox Code Playgroud)
不是很优雅,但它的工作原理.
cha*_*aos 125
ls -t | head -n1
Run Code Online (Sandbox Code Playgroud)
此命令实际上在当前工作目录中提供最新修改的文件.
gio*_*ele 69
这是一个递归版本(即它在某个目录或其任何子目录中找到最近更新的文件)
find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1
Run Code Online (Sandbox Code Playgroud)
编辑:使用-f 2-而不是-f 2凯文建议
ls -lAtr | tail -1
其他解决方案不包含以...开头的文件'.'.
此命令还将包括'.'和'..',可能是您想要的,也可能不是:
ls -latr | tail -1
查找/排序解决方案非常有效,直到文件数量变得非常大(就像整个文件系统一样)。改用 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]* //'
Run Code Online (Sandbox Code Playgroud)
我喜欢 echo *(om[1])( zshsyntax) ,因为它只给出文件名而不调用任何其他命令。
我个人更喜欢使用尽可能少的非内置bash命令(以减少昂贵的 fork 和 exec 系统调用的数量)。ls按需要调用的日期排序。但使用 ofhead并不是真正必要的。我使用以下单行代码(仅适用于支持名称管道的系统):
read newest < <(ls -t *.log)
Run Code Online (Sandbox Code Playgroud)
或获取最旧文件的名称
read oldest < <(ls -rt *.log)
Run Code Online (Sandbox Code Playgroud)
(注意两个“<”标记之间的空格!)
如果还需要隐藏文件 -A arg 可以添加。
我希望这能有所帮助。
基于dmckee答案的简短变体:
ls -t | head -1
Run Code Online (Sandbox Code Playgroud)
有关可靠性的说明:
由于换行符是有效的任何一个文件名,它依赖于任何解决方案线像head/ tail基础的人都是有缺陷的。
对于GNU ls,另一种选择是使用--quoting-style=shell-always选项和一个bash数组:
eval "files=($(ls -t --quoting-style=shell-always))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
Run Code Online (Sandbox Code Playgroud)
(如果您还想考虑隐藏文件,请添加该-A选项ls)。
如果要限制使用常规文件(忽略目录,fifos,设备,符号链接,套接字...),则需要使用GNU find。
对于bash 4.4或更高版本(用于readarray -d)和GNU coreutils 8.25或更高版本(用于cut -z):
readarray -t -d '' files < <(
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]}"
Run Code Online (Sandbox Code Playgroud)
或递归地:
readarray -t -d '' files < <(
LC_ALL=C find . -name . -o -name '.*' -prune -o -type f -printf '%T@%p\0' |
sort -rzn | cut -zd/ -f2-)
Run Code Online (Sandbox Code Playgroud)
最好的办法是使用zsh及其限定符而不是bash避免所有这些麻烦:
当前目录中的最新常规文件:
printf '%s\n' *(.om[1])
Run Code Online (Sandbox Code Playgroud)
包括隐藏的:
printf '%s\n' *(D.om[1])
Run Code Online (Sandbox Code Playgroud)
第二最新:
printf '%s\n' *(.om[2])
Run Code Online (Sandbox Code Playgroud)
解析符号链接后检查文件年龄:
printf '%s\n' *(-.om[1])
Run Code Online (Sandbox Code Playgroud)
递归地:
printf '%s\n' **/*(.om[1])
Run Code Online (Sandbox Code Playgroud)
同样,compinit启用了完成系统(和co)后,它Ctrl+Xm会成为扩展程序,扩展为最新文件。
所以:
六 Ctrl+Xm
使您可以编辑最新文件(在按之前,您还可以查看它Return)。
六 Alt+2Ctrl+Xm
对于第二最新的文件。
vi * .cCtrl+Xm
获取最新c文件。
vi *(。)Ctrl+Xm
以获取最新的常规文件(不是目录,也不是fifo / device ...),依此类推。
如果您想获取最新更改的文件,还包括任何子目录,您可以使用这个小小的 oneliner 来完成:
find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk -v var="1" 'NR==1,NR==var {print $0}' | while read t f; do d=$(date -d @$t "+%b %d %T %Y"); echo "$d -- $f"; done
Run Code Online (Sandbox Code Playgroud)
如果您不想对更改的文件执行相同操作,而是对访问的文件执行相同操作,则只需更改
%Y参数从stat命令到%X。您最近访问的文件的命令如下所示:
find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk -v var="1" 'NR==1,NR==var {print $0}' | while read t f; do d=$(date -d @$t "+%b %d %T %Y"); echo "$d -- $f"; done
Run Code Online (Sandbox Code Playgroud)
对于这两个命令,如果您想列出多个文件,您还可以更改var="1"参数。
| 归档时间: |
|
| 查看次数: |
218819 次 |
| 最近记录: |