폴더에 있는 모든 파일을 탐색하고 특정 날짜에 어떤 파일이 누락되었는지 확인하고 싶습니다.
파일은 시간별로 분할되어 있으며 파일 이름에는 yyyy-mm-dd-hh
형식이 있습니다.
따라서 2017-07-01
와 사이에는 2017-07-02
24개의 파일이 있습니다.2017-07-01-00
2017-07-01-23
위 날짜를 시작 날짜와 종료 날짜로 사용하는 경우 누락된 시간별 파일을 어떻게 찾을 수 있나요?
의견을 보내주셔서 감사합니다!
답변1
# presuming that the files are e. g. template-2017-07-01-16:
# To test a given date
for file in template-2017-07-01-{00..23}; do
if ! [[ -f "$file" ]]; then
echo "$file is missing"
fi
done
# To test a given year
year=2017
for month in seq -w 1 12; do
dim=$( cal $( date -d "$year-$month-01" "+%m %Y" | awk 'NF { days=$NF} END {print days}' )
for day in $(seq -w 1 $dim); do
for file in template-${year}-${month}-${day}-{00..23}; do
if ! [[ -f "$file" ]]; then
echo "$file is missing"
fi
done
done
done
답변2
GNU 시스템에서:
#! /bin/bash -
ret=0
start=${1?} end=${2?}
t1=$(date -d "$start" +%s) t2=$(date -d "$end" +%s)
for ((t = t1; t < t2; t += 60*60)); do
printf -v file '%(%F-%H)T' "$t"
if [ ! -e "$file" ]; then
printf >&2 '"%s" not found\n' "$file"
ret=1
fi
done
exit "$ret"
겨울철로 전환되는 날(서머타임을 구현하는 시간대) 전환 시 파일이 누락된 경우 오류 메시지가 두 번 나타날 수 있습니다. $TZ
하루 24시간을 원하는 경우(예를 들어 이러한 파일을 생성하는 항목이 현지 시간 대신 UTC 시간을 사용하는 경우) UTC0으로 수정하세요.
답변3
다음과 같은 명령은 어떻습니까?
grep -Fvf <(find * -type f \( -name "2017-07-02-00" $(printf " -o -name %s" 2017-07-02-{01..23}) \)) \
<(printf "%s\n" 2017-07-02-{00..23})
ls
2017-07-02-01 2017-07-02-06 2017-07-02-08 2017-07-02-14 2017-07-02-19
2017-07-02-04 2017-07-02-07 2017-07-02-11 2017-07-02-15 2017-07-02-22
명령을 실행한 후 출력:
2017-07-02-00
2017-07-02-02
2017-07-02-03
2017-07-02-05
2017-07-02-09
2017-07-02-10
2017-07-02-12
2017-07-02-13
2017-07-02-16
2017-07-02-17
2017-07-02-18
2017-07-02-20
2017-07-02-21
2017-07-02-23
위에서 우리는 24개 파일의 모든 가능성을 생성하고 매개 변수를 printf
전달했으며 이는 그녀에게도 도움이 되었습니다. 그런 다음 명령을 사용하여 이러한 파일의 존재를 인쇄합니다.find
-name
printf
grep
무늬그러나 find
그들은 발견되지 않았습니다.
답변4
왜 egrep을 사용하지 않습니까? 그런 다음 원하는 방식으로 정규식을 사용할 수 있습니다.
egrep (2017-07-0[1-2]-\d\d$) *file name here*| tail
정규식에 문제가 있을 수 있습니다. 죄송합니다.