파일이 배열에 배치되는 순서 제어

파일이 배열에 배치되는 순서 제어

나는 타임스탬프가 있는 여러 파일을 가져와서 배열에 저장하고 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))

findGNU 및 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...)"}).

관련 정보