显示修改后时间的长列表

显示修改后时间的长列表

是否有一个选项(最好是 GNU 和/或 FreeBSD 选项)指示ls显示修改时间,而不是绝对日期时间,而是显示一个指示自修改以来的小时(或天)的数字?

答案1

我不知道有什么方法可以ls做你想做的事。根据您要寻找的内容,您可以构建一个展示该行为的脚本。

这将是一个很多ls除了这种行为之外,要获得所有附加功能,还需要花费大量的工作,但是您可以得到只是这种行为很容易。

这是此类脚本的一个简单示例:

#!/bin/bash

function age() {
    local -r last_modification="${1}"
    local -r now="$(date +%s)"

    local -r seconds="$((now - last_modification))"
    if [[ ${seconds} -lt 60 ]]; then
        printf "%s seconds ago" "${seconds}"
        return
    fi

    local -r minutes="$((seconds / 60))"
    if [[ ${minutes} -lt 60 ]]; then
        printf "%s minutes ago" "${minutes}"
        return
    fi

    local -r hours="$((minutes / 60))"
    if [[ ${hours} -lt 24 ]]; then
        printf "%s hours ago" "${hours}"
        return
    fi

    local -r days="$((hours / 24))"
    if [[ ${days} -lt 365 ]]; then
        printf "%s days ago" "${days}"
        return
    fi

    local -r years="$((days / 365))"
    printf "%s years ago" "${years}"
}

function list_file() {
    local -r target_file="${1}"
    local -r last_modification="$(stat --format=%Y "${target_file}")"

    stat --format="%A %2h %-8U %-8G %5s $(printf "%-14s" "$(age "${last_modification}")") %n" "${target_file}"
}

if [[ $# -eq 0 ]]; then
    for i in * .*; do
        list_file "${i}"
    done
else
    for i; do
        list_file "${i}"
    done
fi

这是一个示例运行:

$ myls
-rw-------  1 user  group   9061 3 days ago     .bash_history
-rw-r--r--  1 user  group    127 2 years ago    .bash_logout
-rw-r--r--  1 user  group    611 1 years ago    .bashrc
drwxr-xr-x  4 user  group   4096 155 days ago   .cache
-rw-------  1 user  group  40583 5 hours ago    .histfile
-rw-------  1 user  group    703 1 minutes ago  .lesshst
...
$

$ myls myls
-rwxr-xr-x  1 user  group   1127 2 minutes ago  myls
$

如果您给脚本参数,那么它将列出这些参数,否则它将列出当前目录的内容。

它用于stat获取呈现的传统字段ls。它不显示日期,而是使用该age函数打印“友好的,x 个时间单位前”字符串。该功能可以增强,具体取决于您具体想要看到的内容。

相关内容