파일 이름 내 타임스탬프 날짜에서 가장 높은 날짜를 추출합니다.

파일 이름 내 타임스탬프 날짜에서 가장 높은 날짜를 추출합니다.

파일 이름은 다음과 같이 구성됩니다 name$timestamp.extension.

timestamp=`date "+%Y%m%d-%H%M%S"`

따라서 디렉토리에 다음 파일이 있는 경우:

name161214-082211.gz
name161202-082211.gz
name161220-082211.gz
name161203-082211.gz
name161201-082211.gz

답변의 코드/스크립트를 실행하면 값이 20변수에 저장되어야 합니다.highest_day

highest_day = 20

답변1

파일 타임스탬프를 사용하지 않으면 약간 투박해 보이지만 다음과 같은 방법으로 해결할 수 있습니다.

#!/usr/bin/env bash

re="name([0-9]{6})-([0-9]{6})\.gz"
re2="([0-9]{2})([0-9]{2})([0-9]{2})"

for file in *.gz
do
    if [[ "$file" =~ $re ]]
    then
        # BASH_REMATCH[n] on filename where n:
        # [1] is date ie. 161202
        # [2] is time ie. 082211
        date=${BASH_REMATCH[1]}

        # BASH_REMATCH[n] on date string where n:
        # [1] is year ie. 16
        # [2] is month ie. 12
        # [3] is day ie. 02
        [[ $date =~ $re2 ]] && day=${BASH_REMATCH[3]}

        # Keep max day value
        [[ $day > $highest_day ]] && highest_day=$day
    fi
done

echo $highest_day

답변2

이렇게 해도 돼..

highest_day= $(for i in *.gz; do echo ${i:8:2}; done | sort -n | tail -1)

답변3

파일 목록이 파일 내부에 있는 경우 다음과 같습니다.

$ cd dir
$ ls -1 * >infile

이 파이프는 작업을 완료합니다.

$ sed 's/[^0-9]*\([0-9]*\)-.*/\1/' infile | sort -r | head -n1 | cut -c 5-6
20

관련 정보