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

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

我正在尝试按文件创建的象限对文件进行分组。我想要做的是确定文件的创建时间 - 例如,如果我有一个如下所示的文件:

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

我希望输出只是创建它的月份 - 在本例中为8.

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

#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,但尚未弄清楚如何可靠地执行此操作。

任何帮助将不胜感激。

谢谢!

答案1

使用 GNU date,您可以执行以下操作:

quadrant=$(( $(date -r "$file" +'(%-m - 1) / 3 + 1') ))

为了得到象限其中文件最后被修改。

在 中zsh,您可以添加byquadrant全局排序顺序:

zmodload zsh/stat
byquadrant() {
  local month
  stat -A month -F %-m +mtime -- ${1-$REPLY}
  REPLY=$(( (month - 1) / 3 + 1 ))-$REPLY
}

用作:

ls -ldU -- *(o+byquadrant)

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

byquadrant函数返回一个由象限号和原始文件名组成的字符串-,这就是我们告诉 zsho使用 glob 限定符来获取 glob om 的内容o+<functionname>

对于符号链接,zshs stat(如 GNU date -r)默认检索该符号的 mtime目标符号链接的。-L如果您想要符号链接本身的运行时间,请添加。

如果你想使用 GNU 的实现stat(它晚zsh了几年并且不兼容,甚至与早于它数十年的 GNU 不兼容,find而且-printf可用性要差得多),你需要将其输出为一个它支持的两种时间戳格式(iso8601 或原始纪元时间)并以其他方式提取月份。

例如,可以date再次使用 GNU:

quadrant=$(( $(
    set -o pipefail
    stat -c%y -- "$file" | date -f - +'(%-m - 1) / 3 + 1'
  ) ))

请注意,GNUstat默认情况下会获取符号链接的运行时间,而不是其目标(与 相反zsh stat)。-L改变它。

它也不适用于名为-.

对于最新版本的statLinux 上的最新版本的 GNU,您还可以使用%w而不是%y获取出生时间可用的文件(如最新版本的 GNU lswith显示ls -l --time=birth),尽管我发现它作为一个不太有用创建时间比最后修改时间(可以看作是创建时间内容文件的)。

相关内容