파일 이름을 기준으로 파일 타임스탬프를 변경하는 스크립트

파일 이름을 기준으로 파일 타임스탬프를 변경하는 스크립트

저는 macOS 환경을 사용하고 있습니다.

이름이 다음 형식으로 시작하는 여러 파일의 타임스탬프를 변경하고 싶습니다.

XXXXX_DD_MM_YYYY_HH-MM-SS_

다음은 파일 이름의 예입니다.

CALLU_16-10-2018_10-58-26_p123456789012.mp3

생성 및 수정 날짜는 2018-10-16 10:58:26으로 변경되어야 합니다.

다음과 같은 형식의 스크립트가 있습니다 Call@1234567890(1234567890)_20160624205913. 파일 이름 끝부분에서 날짜와 시간을 다음 매개변수로 추출합니다 touch -t STAMP.

for f in *; do
    t="$(awk '/_.*/ { match($0, /_.*/)
                      print substr($0, RSTART + 1, RLENGTH - 7)
                    }'<<<"$f" )"
    touch -t "$t" "$f" 2>/dev/null
done

답변1

오래된 질문

이전 스크립트는 파일 이름의 첫 번째 문자를 awk검색한 다음 다음 문자( )부터 끝 앞의 6자( : +1-7 = -6)까지 모든 항목을 사용했습니다._RSTART+1RLENGTH-7

입력 파일 이름에 따라 20160624ie가 생성됩니다. 날짜만 있고 시간은 없습니다. ~에서touch사양:

옵션 인수는 다음 형식의 10진수여야 합니다.

[[CC]YY]MMDDhhmm[.SS]

각 두 자리 숫자는 다음을 나타냅니다.

MM
 The month of the year [01,12].
DD
 The day of the month [01,31].
hh
 The hour of the day [00,23].
mm
 The minute of the hour [00,59].
CC
 The first two digits of the year (the century).
YY
 The second two digits of the year.
SS
 The second of the minute [00,60]. 

...8자리 숫자만으로 "20"이 월로 해석된다는 의미입니다. 잘못된 날짜. 하지만 당신은 그렇게 하지 않을 거예요 . touch왜냐하면 …2>/dev/null

hh예를 들어 를 사용하여 및 를 제공하려면 4개의 문자를 더 추가해야 합니다 mm. RLENGTH-3. 그러나 이는 이전 파일 이름에만 적용됩니다.

새로운 질문

파일 이름에서 CALLU_16-10-2018_10-58-26_p123456789012.mp3날짜 16-10-2018는 리틀 엔디안 순서(DD-MM-CCYY)이므로 awk스크립트는 구성 요소를 교체하고 구분 기호를 제거해야 합니다.

awk -F '[-_]' '{print $4$3$2$5$6"."$7}'

(입력 파일 이름에 -날짜 이전에 다른 문자가 포함되어 있는 경우 s first 사이의 부분을 추출하기 위해 추가 단계를 수행해야 합니다 _.)

샘플 파일을 사용하여 이를 테스트합니다.

$ echo 'CALLU_16-10-2018_10-58-26_p123456789012.mp3' | awk -F '[-_]' '{print $4$3$2$5$6"."$7}'
201810161058.26

따라서 업데이트된 스크립트는 다음과 같습니다.

for f in *.mp3; do
    t=$(echo "$f" | awk -F '[-_]' '{print $4$3$2$5$6"."$7}')
    touch -t "$t" "$f"
done

관련 정보