首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示文件创建的月份(按创建象限对文件进行分组)

显示文件创建的月份(按创建象限对文件进行分组)
EN

Unix & Linux用户
提问于 2021-08-30 13:31:47
回答 1查看 50关注 0票数 0

我试图按文件创建的象限对文件进行分组。我想要做的是确定什么时候创建了一个文件--例如,如果我有一个如下所示的文件:

-rwxr-xr-x 1 root wheel 208 Aug 30 16:24 q.sh

我希望输出只是创建的那个月--在本例中,是8

一旦计算出这个值,我就可以将其放入一个简单的case语句中,该语句将对其进行排序--目前我想出了如下内容:

代码语言:javascript
复制
#FILE_DATE would be the value I figure out above
case $FILE_DATE in
 [1-3])
        echo "Quadrant 1"
        ;;
[4-6])
        echo "Quadrant 2"
        ;;
[7-9])
        echo "Quadrant 3"
        ;;
[10-12])
        echo "Quadrant 4"
        ;;
esac

我尝试过使用stat命令,以及过滤ls的输出,但是还没有想出如何可靠地做到这一点。

任何帮助都将不胜感激。

谢谢!

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2021-08-30 16:35:08

使用GNU date,您可以这样做:

代码语言:javascript
复制
quadrant=$(( $(date -r "$file" +'(%-m - 1) / 3 + 1') ))

以获得文件最后被修改的象限。

zsh中,您可以按以下方式添加byquadrant glob排序顺序:

代码语言:javascript
复制
zmodload zsh/stat
byquadrant() {
  local month
  stat -A month -F %-m +mtime -- ${1-$REPLY}
  REPLY=$(( (month - 1) / 3 + 1 ))-$REPLY
}

用作:

代码语言:javascript
复制
ls -ldU -- *(o+byquadrant)

例如(这里使用GNU ls's -U禁用ls's自己的排序)按象限进行排序,然后在同一象限内按文件名进行排序。

byquadrant函数返回一个字符串,该字符串由象限数字后面的-和原始文件名组成,这就是我们使用o+ glob限定符告诉order那个glob的内容。

对于符号链接,zsh's stat (类似于GNU date -r)默认检索符号链接目标的mtime。如果需要符号链接本身的mtime,则添加-L

如果您想要使用stat的GNU实现(该实现将zsh's的日期延长几年,并且不兼容,甚至不兼容GNU find's -printf,后者比它早几十年,并且使用起来要少得多),那么您需要以它支持的两种时间戳格式(iso8601或原始时代时间)输出它,并以其他方式提取月份。

例如,可以再次使用GNU date

代码语言:javascript
复制
quadrant=$(( $(
    set -o pipefail
    stat -c%y -- "$file" | date -f - +'(%-m - 1) / 3 + 1'
  ) ))

请注意,默认情况下,GNU stat将为您获取符号链接的mtime,而不是它的目标(与zsh stat相反)。-L来改变它。

它也不适用于一个名为-的文件。

在最新版本的Linux上使用最新版本的GNU stat,您还可以使用%w而不是%y来获取可用的文件的出生时间(如最新版本的GNU lsls -l --time=birth显示的那样),尽管我发现它作为创建时间不如上次修改时间(可以看作是文件内容的创建时间)。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/666867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档