我试图按文件创建的象限对文件进行分组。我想要做的是确定什么时候创建了一个文件--例如,如果我有一个如下所示的文件:
-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的输出,但是还没有想出如何可靠地做到这一点。
任何帮助都将不胜感激。
谢谢!
发布于 2021-08-30 16:35:08
使用GNU date,您可以这样做:
quadrant=$(( $(date -r "$file" +'(%-m - 1) / 3 + 1') ))以获得文件最后被修改的象限。
在zsh中,您可以按以下方式添加byquadrant glob排序顺序:
zmodload zsh/stat
byquadrant() {
local month
stat -A month -F %-m +mtime -- ${1-$REPLY}
REPLY=$(( (month - 1) / 3 + 1 ))-$REPLY
}用作:
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:
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 ls和ls -l --time=birth显示的那样),尽管我发现它作为创建时间不如上次修改时间(可以看作是文件内容的创建时间)。
https://unix.stackexchange.com/questions/666867
复制相似问题