Bash 스크립트에서 날짜를 비교하는 방법

Bash 스크립트에서 날짜를 비교하는 방법

파일 구조에서 가장 오래된 디렉터리를 확인하기 위해 bash에 스크립트를 작성하려고 합니다.

이 예에는 생성된 날짜와 시간을 모방한 제목을 가진 4개의 디렉터리가 있습니다. 이러한 파일은 , 2022-02-21:20:30:23및 입니다 . 이 경우 날짜는 임의적이며 단지 스크립트 테스트용으로 개발되었습니다.2022-02-21:22:30:232022-02-28:22:30:232023-02-28:22:30:23

나는 스크립트가 해당 디렉토리 내에 존재하는 디렉토리를 식별하고 디렉토리 이름을 기반으로 가장 오래된 디렉토리를 식별할 수 있기를 원합니다.

내 초기 시도는 다음과 같습니다. 예, 문자열이 날짜로 올바르게 선언되지 않았다는 것을 알고 있지만 이를 수행하는 방법을 모르고 몇 가지 조언을 사용할 수 있습니다.

oldest="1899-01-01:01:01:01"
dirs=`ls -d */`
for i in $dirs ; do
    if [[ oldest < $i  ]] ; then
        oldest=$i
    fi
done
echo $oldest

답변1

(나는 당신이 보여주는 명명 규칙이 당신을 위한 것이라고 가정합니다.목차그리고 가장 오래된 디렉토리를 찾고 싶습니다. 나는 무시했다문서이 디렉토리에. )

명명 규칙에 따라 디렉토리 이름은 확장 쉘 glob에 의해 자동으로 올바르게 정렬되어 */가장 오래된 디렉토리 이름이 먼저 확장됩니다. 기본적으로 쉘은 사전순으로 일치하는 이름을 제공합니다.

*/이는 와일드카드 패턴을 확장하고(정확히 일치한다고 가정) 결과를 배열에 저장하고 해당 배열의 첫 번째 및 마지막 요소를 확인하여 가장 오래되고 최신 디렉터리를 얻을 수 있음을 의미합니다 .

dirs=( */ )
printf 'Oldest dir by name is "%s"\n' "${dirs[0]}"
printf 'Newest dir by name is "%s"\n' "${dirs[-1]}"

위의 "가장 오래된 이름/최신 이름"을 참고하세요.실제로"사전순으로 첫 번째/마지막 정렬"을 의미합니다.

/출력 디렉토리 경로의 꼬리를 제거하려면 표준 매개변수 대체를 사용하십시오.

dirs=( */ )
printf 'Oldest dir by name is "%s"\n' "${dirs[0]%/}"
printf 'Newest dir by name is "%s"\n' "${dirs[-1]%/}"

답변2

파일 이름이 모두 이 YYYY-MM-DD:HH:MM:SS형식이고 파일 이름이 중요한 경우 사전순으로 정렬할 수 있습니다. 예를 들어 다음은 가장 오래된 이름을 가진 폴더여야 합니다.

printf "%s\n" */ | sort | head -n1

답변3

파일 이름은 항상 이런 형식을 취합니까 YYYY-mm-dd:HH:MM:ss? 그렇다면 숫자만 다루면 되기 때문에 더 쉽습니다. 이미 언급한 @muru처럼 를 사용하는 것이 sort가장 직관적인 방법이 될 것입니다. 이와 같이:ls -d --format=single-column */ | sort | head -n 1

수정 날짜를 사용하려면 ls직접 사용할 수 있습니다.

ls -dt --format=single-column */ | head -n 1 # most recent modification date
ls -dt --format=single-column */ | tail -n 1 # oldest modification date

-d: 디렉토리 만 표시합니다. -t: 날짜순으로 정렬합니다. single-column: (파일) 이름만 표시합니다. */

클래식 if a < b; then min = b루프는 bash에서 세트의 최대/최소 수를 찾는 기본 방법입니다. 하지만 번역도 할 수 있어요날짜문자열을 숫자로 변환하여 datebash 내장 함수를 사용할 수 있습니다 [ .. -t .. ]. 비록 이것이귀하의 특정 상황에는 적용되지 않습니다.date- 현재 날짜는 첫 번째 콜론(YYYY-mm-dd HH:MM:SS)으로 인해 파싱할 수 없습니다.:

# mind the space ---v
filename='1989-06-08 12:42:00'
number=$(date -d "$filename" '+%s'))
# 'date' values can directly be compared:
now=$(date '+%s')
if [ number -lt  now ]; then
  echo $(date -d "number") was in the past.
else
  echo $(date -d "number") is in the future.
fi
  

관련 정보