控制文件放入数组的顺序

控制文件放入数组的顺序

我有一个脚本,可以抓取一堆带时间戳的文件,并将它们放入一个数组中,由 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...)"}).

相关内容