AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1309521
Accepted
B.Tanner
B.Tanner
Asked: 2021-01-21 04:37:55 +0800 CST2021-01-21 04:37:55 +0800 CST 2021-01-21 04:37:55 +0800 CST

`ls -l` 输出持续时间而不是日期/时间,例如“5 分钟”/“6 小时”/“7 天”等?

  • 772

如果我上次修改文件是在 5 分钟前,是否可以ls-l输出类似“5 分钟”而不是实际日期/时间的内容?

command-line
  • 4 4 个回答
  • 819 Views

4 个回答

  • Voted
  1. ognjen
    2021-01-21T07:58:51+08:002021-01-21T07:58:51+08:00

    我使用 stat 来获取文件的元数据信息。一些例子:

    stat -c $'%y\t%n' * | sort -n
    

    输出如下所示:

    2020-01-27 11:52:25.681249958 +0200 CHANGELOG.md
    

    然后查找单个文件

    stat CHANGELOG.md
    

    输出如下所示:

      File: CHANGELOG.md
      Size: 94          Blocks: 8          IO Block: 4096   regular file
      Device: fd00h/64768d  Inode: 6029378     Links: 1
      Access: (0644/-rw-r--r--)  Uid: (  998/example)   Gid: (  998/example)
      Access: 2020-11-12 17:47:34.768793021 +0200
      Modify: 2020-01-27 11:52:25.681249958 +0200
      Change: 2020-11-12 17:47:02.282093672 +0200
      Birth: -
    

    否则,您可能需要一个小的 bash 脚本来显示文件创建时间和当前时间之间的差异。

     LastUpdate="$(stat -c %Y myfile)"
     now="$(date +%s)"
     let diff="${now}-${lastUpdate}"
    
    • 1
  2. user986805
    2021-01-21T12:40:29+08:002021-01-21T12:40:29+08:00

    这是用于解析的早期脚本
    ls -l的延续,并进行了一些增强:

    #!/bin/bash
    
    while read -r p c u g s e n; do
        [[ $p = total ]] && { \
            echo "$p $c" 1>&2; continue; \
        }
        x=$(($EPOCHSECONDS - e))
        y=$((x / 60))
        z=$((x % 60))
        printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
                "$p" \
                "$c" \
                "$u" \
                "$g" \
                "$s" \
                "$y minutes" \
                "$z seconds" \
                "$n"
    done < <( \
        ls -LApl --color=force \
                 --time-style=+%s \
                 --quoting-style=shell-escape "$@" \
    ) \
    | column -t -R 2,5,6,7 -s $'\t' -o ' '
    
    • 1
  3. Raffa
    2021-01-21T14:11:57+08:002021-01-21T14:11:57+08:00

    单程:

    您可以ls从纪元开始以秒为单位制作打印修改时间,如下所示:

    ls -l --time-style="+%s"
    

    然后通过管道ls输出来awk执行逻辑,如下所示:

    ls -l --time-style="+%s" | awk -v now=$(date +%s) '{$6 = now - $6; d=int($6/60/60/24); h=int($6/60/60%24); m=int($6/60%60); s=int($6%60);$6 = "="d" Days "h" Hours "m" Mins "s" Secs ago="; print}' | column -t -s'='
    

    因为命令行很长,这里有一个基本相同但视觉上更包含的分解:

    ls -l --time-style="+%s" | \
    awk -v now=$(date +%s) '{\
    $6 = now - $6; \
    d=int($6/60/60/24); \
    h=int($6/60/60%24); \
    m=int($6/60%60); \
    s=int($6%60);\
    $6 = "="d" Days "h" Hours "m" Mins "s" Secs ago="; print}' | column -t -s'='
    
    • -v now=$(date +%s)将自纪元以来的当前时间(以秒为单位)分配给now

    • $6 = now - $6将计算自上次修改文件以来的时间(以秒为单位)。

    • d=int($6/60/60/24)将计算天数。

    • h=int($6/60/60%24)将计算不到一天的剩余小时数。

    • m=int($6/60%60)将计算不到一小时的剩余分钟数。

    • s=int($6%60)将计算不到一分钟的剩余秒数。

    • $6 = d" Days "h" Hours "m" Mins "s" Secs ago"会将修改日期更改为2 天 5 小时 3 分钟 47 秒前。


    另一种方式:

    ls -l您可以在 bash 脚本中构建自己的自定义替代方案,如下所示:

    #!/bin/bash
    
    for f in *
            do
            p=$(stat -c "%A=%h=%U=%G=%s" "$f")
            m=$(date -r "$f" "+%s")
            n=$(date "+%s")
            l=$((n-m))
            d=$((l/60/60/24))
            h=$((l/60/60%24))
            m=$((l/60%60))
            s=$((l%60))
            echo "$p= = =$d Days=$h Hours=$m Mins=$s=Secs= = =$f" | column -t -s'='
            done
    

    或者使输出更简单,时间更严格,如下所示:

    #!/bin/bash
    
    for f in *
            do
            p=$(stat -c "%A %h %U %G %s" "$f")
            m=$(date -r "$f" "+%s")
            n=$(date "+%s")
            l=$((n-m))
            d=$((l/60/60/24))
            h=$((l/60/60%24))
            m=$((l/60%60))
            s=$((l%60))
            if (( $d >= 1 ))
                    then
                    t="$d Days"
            elif (( $h >= 1 ))
                    then
                    t="$h Hours"
            elif (( $m >= 1 ))
                    then
                    t="$m Mins"
            else
                    t="$s Secs"
            fi 
            echo "$p= = =$t= = =$f" | column -t -s'='
            done
    

    使用注意事项:

    如果您将上述命令或上述脚本保存在主目录中的文件中,请为该文件命名并使其可执行,如下所示:lsl.sh

    chmod +x ~/lsl.sh
    

    您可以添加这样的别名:

    alias lsl='bash ~/lsl.sh'
    

    到你的~/.bashrc文件,这样你就可以在后面运行简短的命令:`

    lsl
    

    从任何目录并获得所需的结果。

    • 0
  4. Best Answer
    B.Tanner
    2021-02-02T06:14:15+08:002021-02-02T06:14:15+08:00

    在这里回答我自己的问题,因为这实际上是我最终要做的。

    ls -l使用将输出解析为单词流(bash,等)的任何方法都无法获得任何令人满意的结果awk,column因为 a) 带有空格的文件名弄乱了,并且 b)ls -l的对齐列弄乱了(例如,右对齐的文件大小)。ls -l | column -t同时显示这两个问题。

    我会因为效率低下而被击落,但这是我的最终脚本,用于sed替换ls -l保持列宽的部分输出:

    day0=`date                     +"%b %_d"`
    day1=`date --date "1 day  ago" +"%b %_d"`
    day2=`date --date "2 days ago" +"%b %_d"`
    day3=`date --date "3 days ago" +"%b %_d"`
    day4=`date --date "4 days ago" +"%b %_d"`
    day5=`date --date "5 days ago" +"%b %_d"`
    day6=`date --date "6 days ago" +"%b %_d"`
    
    min0=`date                        +"%H:%M"`
    min1=`date --date "1 minute  ago" +"%H:%M"`
    min2=`date --date "2 minutes ago" +"%H:%M"`
    min3=`date --date "3 minutes ago" +"%H:%M"`
    min4=`date --date "4 minutes ago" +"%H:%M"`
    min5=`date --date "5 minutes ago" +"%H:%M"`
    min6=`date --date "6 minutes ago" +"%H:%M"`
    min7=`date --date "7 minutes ago" +"%H:%M"`
    min8=`date --date "8 minutes ago" +"%H:%M"`
    min9=`date --date "9 minutes ago" +"%H:%M"`
    
    ls -lh --color=force --quoting-style=shell-escape "$@"|sed "\
      /$day6 \(.[0-9]:[0-9][0-9]\)/ s/$day6/6 days/; t
      /$day5 \(.[0-9]:[0-9][0-9]\)/ s/$day5/5 days/; t
      /$day4 \(.[0-9]:[0-9][0-9]\)/ s/$day4/4 days/; t
      /$day3 \(.[0-9]:[0-9][0-9]\)/ s/$day3/3 days/; t
      /$day2 \(.[0-9]:[0-9][0-9]\)/ s/$day2/2 days/; t
      /$day1 \(.[0-9]:[0-9][0-9]\)/ s/$day1/yesday/; t
      /$day0 \(.[0-9]:[0-9][0-9]\)/ s/$day0/ today/; T
      s/$min0/  now/; t
      s/$min1/1 min/; t
      s/$min2/2 min/; t
      s/$min3/3 min/; t
      s/$min4/4 min/; t
      s/$min5/5 min/; t
      s/$min6/6 min/; t
      s/$min7/7 min/; t
      s/$min8/8 min/; t
      s/$min9/9 min/; t
      "
    

    的样本输出/var/log/syslog*:

    -rw-r----- 1 syslog adm    9240  today   now /var/log/syslog
    -rw-r----- 1 syslog adm 1279965  today 8 min /var/log/syslog.1
    -rw-r----- 1 syslog adm   51750 2 days 14:12 /var/log/syslog.2.gz
    -rw-r----- 1 syslog adm   14768 3 days 10:59 /var/log/syslog.3.gz
    -rw-r----- 1 syslog adm    7767 4 days 10:04 /var/log/syslog.4.gz
    -rw-r----- 1 syslog adm  119295 5 days 09:49 /var/log/syslog.5.gz
    -rw-r----- 1 syslog adm   33450 6 days 13:06 /var/log/syslog.6.gz
    -rw-r----- 1 syslog adm   21372 Jan 25 11:12 /var/log/syslog.7.gz
    
    

    (不知道为什么日志在这里显示为红色;它不在我的终端上。)

    这仅在命令行中使用,因此所有这些date命令都无关紧要,实际上我根本没有注意到任何延迟。

    更新:

    time`ls -l /var/log/syslog*' 的输出:

    real    0m0.002s
    user    0m0.002s
    sys     0m0.000s
    

    time我的新脚本的输出:

    real    0m0.019s
    user    0m0.018s
    sys     0m0.003s
    
    • 0

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve