获取 Linux 目录中的最新文件

2024-10-14 08:39:00
admin
原创
69
摘要:问题描述:寻找一个可以返回目录中单个最新文件的命令。没有看到限制参数ls...解决方案 1:ls -Art | tail -n 1 这将返回最新修改的文​​件或目录。虽然不太优雅,但确实有效。使用的旗帜:-A`.列出除以下之外的所有文件..`-r排序时反转顺序-t按时间排序,最新优先解决方案 2:ls -t ...

问题描述:

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

没有看到限制参数ls...


解决方案 1:

ls -Art | tail -n 1

这将返回最新修改的文​​件或目录。虽然不太优雅,但确实有效。

使用的旗帜:

-A`.列出除以下之外的所有文件..`

-r排序时反转顺序

-t按时间排序,最新优先

解决方案 2:

ls -t | head -n1

该命令实际上给出的是当前工作目录中最新修改的文​​件或目录。

解决方案 3:

这是一个递归版本(即它在某个目录或其任何子目录中找到最近更新的文件)

find /dir/path -type f -printf "%T@ %p
" | sort -n | cut -d' ' -f 2- | tail -n 1

命令行的简单解释:

  • find /dir/path -type f查找目录中的所有文件

    • `-printf "%T@ %p
      "为每个文件打印一行,其中%T@是自 1970 年以来的浮点秒数,%p是文件名路径,

`是换行符

+ 更多信息请参见`man find`
  • |是一个 shell pipe(参见man bash部分Pipelines

  • sort -n表示按第一列排序,并将标记视为数字,而不是字典顺序(参见man sort

  • cut -d' ' -f 2-表示使用字符拆分每一行,然后从第二个标记开始打印所有标记(参见man cut

    • 注意:-f 2仅打印第二个标记

  • tail -n 1表示打印最后一行(参见man tail

解决方案 4:

关于可靠性的说明:

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

对于 GNU 来说ls,另一个选择是使用--quoting-style=shell-always选项和bash数组:

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

(如果您还想考虑隐藏文件,请添加该-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' |
  sort -rzn | cut -zd/ -f2)

((${#files[@]} > 0)) && printf '%s
' "${files[0]}"

或者递归:

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

最好的方法是使用zsh及其 glob 限定符,而不是bash避免所有这些麻烦:

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

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

包括隐藏的:

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

第二新:

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

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

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

递归地:

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

此外,启用完成系统(compinit和 co)后,Ctrl+X`m`将成为扩展到最新文件的完成器。

所以:

六Ctrl+Xm

会让您编辑最新的文件(您也有机会在按下之前看到它是哪一个Return)。

六Alt+2Ctrl+Xm

对于第二新的文件。

vi *.cCtrl+Xm

获取最新c文件。

六*(.)Ctrl+Xm

对于最新的常规文件(不是目录,也不是fifo /设备......),等等。

解决方案 5:

我使用:

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

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

解决方案 6:

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

解决方案 7:

在文件数量变得非常大(例如整个文件系统)之前,查找/排序解决方案效果很好。使用 awk 来跟踪最新的文件:

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

解决方案 8:

ls -lAtr | tail -1

其他解决方案不包含以 开头的文件'.'

此命令还将包括'.''..',这可能是也可能不是您想要的:

ls -latr | tail -1

解决方案 9:

根据 dmckee 的答案简化的变体:

ls -t | head -1

解决方案 10:

我个人更喜欢尽可能少地使用非内置bash命令(以减少昂贵的 fork 和 exec 系统调用的数量)。要按日期排序,ls需要调用。但使用 ofhead并不是真正必要的。我使用以下一行代码(仅适用于支持名称管道的系统):

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

或者获取最旧文件的名称

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

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

如果还需要隐藏文件,可以添加 -A arg。

我希望这能有所帮助。

解决方案 11:

如果您想要获取最近更改的文件(包括任何子目录),您可以使用这个小命令来实现:

find . -type f -exec stat -c &#039;%Y %n&#039; {} ; | sort -nr | awk -v var=&quot;1&quot; &#039;NR==1,NR==var {print $0}&#039; | while read t f; do d=$(date -d @$t &quot;+%b %d %T %Y&quot;); echo &quot;$d -- $f&quot;; done

如果您不想对已更改的文件执行相同操作,而是对已访问的文件执行相同操作,则只需更改

stat命令中的%Y参数更改为%X。针对最近访问的文件的命令如下所示:

find . -type f -exec stat -c &#039;%X %n&#039; {} ; | sort -nr | awk -v var=&quot;1&quot; &#039;NR==1,NR==var {print $0}&#039; | while read t f; do d=$(date -d @$t &quot;+%b %d %T %Y&quot;); echo &quot;$d -- $f&quot;; done

对于这两个命令,如果您想列出多个文件,您还可以更改var="1"参数。

解决方案 12:

递归地:

find $1 -type f -exec stat --format &#039;%Y :%y %n&#039; &quot;{}&quot; ; | sort -nr | cut -d: -f2- | head

解决方案 13:

仅使用 Bash 内置命令,紧密遵循BashFAQ/003:

shopt -s nullglob

for f in * .*; do
    [[ -d $f ]] &amp;&amp; continue
    [[ $f -nt &quot;$latest&quot; ]] &amp;&amp; latest=$f
done

printf &#039;%s
&#039; &quot;$latest&quot;

解决方案 14:

ls -t -1 | sed &#039;1q&#039;

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

ls -t -1 | grep foo | sed &#039;1q&#039;

解决方案 15:

使用 R 递归选项..你可以认为这是对这里好答案的增强

ls -arRtlh | tail -50

解决方案 16:

速度快、支持无限文件、特殊字符安全:

find . -type f -printf &#039;%T@ %p&#039; \n| sort -zn | tail -zn1 | cut -zc 23- | xargs --null ls -l

ls -l用应该处理文件名的任何内容替换最后一个。

解决方案 17:

尝试这个简单的命令

ls -ltq  &lt;path>  | head -n 1

如果您想要文件名 - 最后修改时间,路径 = /ab/cd/*.log

如果您想要目录名称 - 最后修改时间,路径 = /ab/cd/*/

解决方案 18:

所有这些 ls/tail 解决方案对于目录中的文件来说都可以很好地工作-忽略子目录。

为了将所有文件包含在搜索中(递归),可以使用 find。gioele 建议对格式化的 find 输出进行排序。但要小心空格(他的建议不适用于空格)。

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

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

按修改时间排序,请参阅 man find:

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

因此只需将其替换%T%C按 ctime 排序即可。

解决方案 19:

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

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

解决方案 20:

假设你不关心以.

ls -rt | tail -n 1

否则

ls -Art | tail -n 1

解决方案 21:

ls -Frt | grep &quot;[^/]$&quot; | tail -n 1

解决方案 22:

如果您想在 /apps/test 目录中找到最后修改的文件夹名称,那么您可以将下面的代码片段放入批处理脚本中并执行它,它将打印最后修改的文件夹名称的名称。

#!/bin/bash -e

export latestModifiedFolderName=$(ls -td /apps/test/*/ | head -n1)

echo Latest modified folder within /apps/test directory is $latestModifiedFolderName

解决方案 23:

如果你想要跟踪目录中文件的更改,你可以使用inotify-tools:

inotifywait -r -e modify,create,delete --format &#039;%w%f&#039; .

选项:-r 递归,-e 要监视的事件,%w 监视的目录,%f 目录中的文件名。

解决方案 24:

我也需要这样做,并且我发现了这些命令。这些对我有用:

如果您想要按文件夹中的创建日期(访问时间)查找最后一个文件:

ls -Aru | tail -n 1  

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

ls -Art | tail -n 1  

解决方案 25:

查找前缀为的文件shravan*并查看

less $(ls -Art shravan* | tail -n 1)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用