我有一个脚本,可以抓取一堆带时间戳的文件,并将它们放入一个数组中,由 Mutt 处理并通过电子邮件发送给我。我的问题是,这些文件只是随机放入数组中,因此,以混乱的方式通过电子邮件发送给我。有没有办法控制这些文件放入数组的顺序?我希望它们按日期排序。这是我正在使用的脚本:
#!/bin/bash
date=$(date +%F)
recipients="[email protected]"
body="Found these files:"
mapfile -t files < <(find /my/directory -name '*.jpg' -newermt '-15 seconds' -not -newermt '-2 seconds')
if [ -z "$files" ]; then
body="No files were found"
echo "$body" | mutt -s "Error on $TODAY" $recipients
fi
echo "$body" | mutt -s "Files found on $date" -a "${files[@]}" -- $recipients
echo "${files[@]}"
答案1
使用zsh
而不是bash
,您可以在其中定义排序(默认情况下按名称):
files=(/my/directory/**/*.jpg(.NDms+2ms-15))
这也将避免包含换行符的文件名出现问题(但可以使用 的bash-4.4
支持mapfile
)。-d ''
find -print0
排序 (哦订单)由米修改时间:
files=(/my/directory/**/*.jpg(.NDms+2ms-15om))
find
要获得 GNU和 GNU的类似(按名称)订单sort
:
find /my/directory -name '*.jpg' \
-type f \
-newermt '-15 seconds' \
! -newermt '-2 seconds' \
-print0 |
sort -zt/ -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 -k6,6 -k7,7 -k8,8 \
-k9,9 -k10,10 -k11,11 -k12,12 -k13,13 -k14,14
对于修改时间顺序:
find /my/directory -name '*.jpg' \
-type f \
-newermt '-15 seconds' \
! -newermt '-2 seconds' \
-printf '%T@:%p\0' |
sort -zn |
sed -z 's/[^:]*://#'
添加| tr '\0' '\n'
到 bash 中的存储标量readarray
(不是数组)变量或与/mapfile
不一起使用-d ''
(在换行符上拆分,在这种情况下,您也可以在换行符分隔记录而不是 NUL 分隔记录上完成整个操作)。
或者readarray -d '' array < <(find...)
与 bash 4.4 或更高版本一起使用,或者在zsh
, 使用array=(${(0)"$(find...)"})
.