ls:显示目录树中列表中的每个目录/文件的最后更新文件的日期

ls:显示目录树中列表中的每个目录/文件的最后更新文件的日期

我正在寻找参数ls或等效参数,它们对指定的目录执行以下操作:

对于每个子目录:

  • 递归地查看其包含的每个文件和目录。
  • 查找更新/修改日期最近的文件或目录。
  • 显示此递归更新日期。
  • 或者,按此递归更新日期排序。

据我所知,常规ls -lArt命令仅查看文件夹本身的更新日期,而不查看文件夹内容。

因此,我正在寻找du -hs * | sort -h与文件大小相当的东西。


例子

考虑以下目录结构。

- dir
  - subdir1:        last udpated 2013-07-07
    - subdir1a:     last updated 2012-01-01
      * file1a1.txt last updated 2016-02-22
    * file1b.txt:   last updated 2016-01-06
    * file1c.txt:   last updated 2015-12-30

  - subdir2:        last updated 2016-03-10
    * file2a.txt:   last updated 2016-02-04

  * file3.txt:      last updated 2014-02-13

(sorted)的输出ls-special dir如下:

file3.txt: last updated 2014-02-13
subdir1:   last updated 2016-02-22
subdir2:   last updated 2016-03-10

答案1

你需要:

find . -type d -exec sh -c 'echo -n {}; cd "{}"; ls -ltd * | grep -v ^d | head -n 1 | awk "{\$1=\$2=\$3=\$4=\$5=\$6=\$7=\$8=\"\"; print \$0}"; echo"" ' \;

其作用:首先找到起始目录的所有子目录,然后执行以下-exec部分:

echo -n {}; cd "{}"; ls -ltd * | grep -v ^d | head -n 1 | awk "{\$1=\$2=\$3=\$4=\$5=\$6=\$7=\$8=\"\"; print \$0}"; echo""

这将生成一个新的 shell(每个子目录一个),打印子目录的名称,进入该目录,按访问时间排序(-t)所有内容(IE,文件和目录)以长格式(-l)呈现,而无需展开目录的内容(-d)。需要使用长格式,以便我们可以剔除目录( ),只取最近访问的grep -v ^d第一行输出( )head -n 1文件,然后(awk)我们只打印它的名称(而不是所有其他参数),记住它的名称可能包含空格:最后,它打印一个换行符,以便目录内容不会与下一个内容混淆。

请记住,没有办法区分公平处理修改时间。

答案2

以下命令列出当前树的所有文件(.),最新文件显示最后:

find . -type f -printf "%T@ %p\n" | sort -n | awk '{print $2}' | xargs ls -lart

相关内容