스크립트 - 파일 이름 날짜를 현재 날짜와 비교

스크립트 - 파일 이름 날짜를 현재 날짜와 비교

이름에 날짜가 포함된 파일을 시스템의 현재 날짜-시간과 비교하려고 합니다.

파일 이름은 다음 형식을 따릅니다.

파일명.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. 출력은 가장 높은 순서의 단일 파일 이름만 반환 하도록 파이프됩니다 . 또는 오늘보다 오래된 파일이 없는 경우 빈 문자열이 반환될 수도 있습니다.sortYYYYMMDDsorthead -1

관련 정보