我正在尝试按文件创建的象限对文件进行分组。我想要做的是确定文件的创建时间 - 例如,如果我有一个如下所示的文件:
-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>
。
对于符号链接,zsh
s 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
改变它。
它也不适用于名为-
.
对于最新版本的stat
Linux 上的最新版本的 GNU,您还可以使用%w
而不是%y
获取出生时间可用的文件(如最新版本的 GNU ls
with显示ls -l --time=birth
),尽管我发现它作为一个不太有用创建时间比最后修改时间(可以看作是创建时间内容文件的)。