이름에 날짜가 포함된 파일을 시스템의 현재 날짜-시간과 비교하려고 합니다.
파일 이름은 다음 형식을 따릅니다.
파일명.yyyymmdd.hhmm.file(예: File156tr.20220914.0958.txt)
나는 다음 스크립트를 생각해 냈습니다.
#!/bin/bash
FROM_FILE=$(ls -1 /some/directory/File156tr.*.*.txt | grep -Eo '[[:digit:]]{8}')
NOW=$(date +"%Y%m%d")
DIFFERENCE=$((NOW - FROM_FILE))
if [ $DIFFERENCE -ge 1 ]; then
echo "There are files that are older than today's date"
fi
문제는 해당 유형의 파일이 1개만 있을 때 스크립트가 완벽하게 작동한다는 것입니다. 하지만 예를 들어,파일은 같지만 날짜 이름이 다릅니다. (예를 들어 동일한 디렉터리에 있는 File156tr.20220913.1053.txt 및 File156tr.20220914.0958.txt)ls 명령은 파일 이름에 두 날짜를 모두 인쇄하므로 이 스크립트는 작동하지 않습니다.
이름은 같지만 이름에 날짜/시간이 다른 파일이 여러 개 있는 경우(위에서 언급한 대로) 이를 어떻게 인쇄합니까?가장 최근 것(현재 날짜에 가장 가까운 것)만?
답변1
루프의 용도는 다음과 같습니다.
#!/bin/bash
for FILE in /some/directory/File156tr.*.*.txt
do
FROM_FILE=$(echo $FILE | grep -Eo '[[:digit:]]{8}')
NOW=$(date +"%Y%m%d")
DIFFERENCE=$(($NOW - $FROM_FILE))
if [ $DIFFERENCE -ge 1 ]; then
echo "There are files that are older than today's date"
fi
done
답변2
내가 찾고 있는 스크립트는 오늘보다 오래된 모든 파일 중 최신 파일만 인쇄해야 합니다.
존재하는 파일 이름 목록을 작성하고 현재 날짜와 일치하는 이름을 제거한 다음 목록을 정렬하는 것이 좋습니다. 목록의 마지막 항목이 최신 항목입니다. 또는 원하는 경우 목록의 첫 번째 항목이 최신 항목이 되도록 목록을 역순으로 정렬할 수 있습니다.
경로 부분에 YYYYMMDD
날짜 문자열 이 없다고 가정하면 /some/directory/
다음과 같이 간단하게 작동할 수 있습니다.
#!/usr/bin/env bash
mr="$(
for f in /some/directory/File156tr.*.*.txt
do
[[ -f "$f" ]] && printf '%s\n' "$f"
done |
sort -r |
egrep -v "$(date "+%Y%m%d")" |
head -1
)"
if [[ -z "$mr" ]]
then
printf 'There are no files prior to today.\n'
else
printf 'The most recent file prior to today is "%s"\n' "$mr"
fi
이 코드는 와일드카드와 일치하는 모든 파일을 반복하고 모든 파일 이름을 연결한 후 내림차순으로 정렬하고 오늘 날짜와 일치하는 문자열이 포함된 모든 파일 이름을 제거합니다 sort
. 출력은 가장 높은 순서의 단일 파일 이름만 반환 하도록 파이프됩니다 . 또는 오늘보다 오래된 파일이 없는 경우 빈 문자열이 반환될 수도 있습니다.sort
YYYYMMDD
sort
head -1