파일 이름의 날짜 이후에 파일이 수정되었는지 테스트합니다.

파일 이름의 날짜 이후에 파일이 수정되었는지 테스트합니다.

YYYYMMDD다음과 같은 파일 이름을 가진 파일이 있습니다 .

file-name-20151002.txt

있는지 확인하고 싶습니다.이것2015년 10월 2일 이후 문서가 수정되었습니다.

노트:

  • 출력을 보면 이 작업을 수행할 수 있지만 ls출력을 구문 분석하는 것은 ls좋지 않은 생각이라는 것을 알고 있습니다.
  • 굳이 검색할 필요는 없어모두특정 날짜 이후의 파일은 테스트해 보세요.하나한 번에 하나의 파일을 지정하십시오.
  • 파일이 생성된 다음날 수정되는 것에 대해 걱정하지 않습니다. 즉, 20151002이 이름의 파일이 2015년 10월 3일 이후에 수정되었는지 알고 싶을 뿐입니다 .
  • MacO 10.9.5를 사용하고 있습니다.

답변1

다음 스크립트는 명령줄에 지정된 모든 파일의 날짜를 확인합니다.

GNU 버전의 sed, datestat

$ cat check-dates.sh 
#! /bin/bash

for f in "$@" ; do
  # get date portion of filename
  fdate=$(basename "$f" .txt | sed -re 's/^.*(2015)/\1/')

  # convert it to seconds since epoch + 1 day
  fsecs=$(echo $(date +%s -d "$fdate") + 86400 | bc )

  # get modified timestamp of file in secs since epoch
  ftimestamp=$(stat -c %Y "$f")

  [ "$ftimestamp" -gt "$fsecs" ] && echo "$f has been modified after $fdate"
done

$ ./check-dates.sh file-name-20151002.txt 
file-name-20151002.txt has been modified after 20151002
$ ls -l file-name-20151002.txt 
-rw-rw-r-- 1 cas cas 0 Oct 26 19:21 file-name-20151002.txt

이것은 테스트되지 않은 버전이지만 온라인 매뉴얼 페이지를 올바르게 읽으면 Mac(및 FreeBSD 등)에서 작동할 것입니다.

#! /bin/bash

for f in "$@" ; do
  # get date portion of filename
  fdate=$(basename "$f" .txt | sed -e 's/^.*\(2015\)/\1/')

  # convert it to seconds since epoch + 1 day
  fsecs=$(echo $(date -j -f %Y%m%d "$fdate" +%s) + 86400 | bc )

  # get modified timestamp of file in secs since epoch
  ftimestamp=$(stat -f %m "$f")

  [ "$ftimestamp" -gt "$fsecs" ] && echo "$f has been modified after $fdate"
done

답변2

가능한 접근 방식은 다음과 같습니다.

  • OSX stat:

    newer () {
    tstamp=${1:${#1}-12:8}
    mtime=$(stat -f "%Sm" -t "%Y%m%d" "$1")
    [[ ${mtime} -le ${tstamp} ]] && printf '%s\n' "$1 : NO: mtime is ${mtime}" || printf '%s\n' "$1 : YES: mtime is ${mtime}"
    }
    
  • GNU date:

    newer () {
    tstamp=${1:${#1}-12:8}
    mtime=$(date '+%Y%m%d' -r "$1")
    [[ ${mtime} -le ${tstamp} ]] && printf '%s\n' "$1 : NO: mtime is ${mtime}" || printf '%s\n' "$1 : YES: mtime is ${mtime}"
    }
    
  • zsh오직:

    zmodload zsh/stat
    newer () {
    tstamp=${1:${#1}-12:8}
    mtime=$(zstat -F '%Y%m%d' +mtime -- $1)
    [[ ${mtime} -le ${tstamp} ]] && printf '%s\n' "$1 : NO: mtime is ${mtime}" || printf '%s\n' "$1 : YES: mtime is ${mtime}"
    }
    

용법:

최신문서

출력 예:

file-name-20150909.txt : YES: mtime is 20151026

또는

file-name-20151126.txt : NO: mtime is 20151026

답변3

bash를 사용하여 날짜를 숫자 형식으로 가져와 비교합니다 stat.expr

#!/bin/bash
for file
do  moddate=$(stat -f %m -t %F "$file") # MacOS stat
    moddate=${moddate//-/} # 20151026
    if filedate=$(expr "$file" : '.*-\([0-9]*\).txt')
    then  if [ $moddate -gt $filedate ]
          then echo "$file: modified $moddate"
          fi
    fi
done

이것은 Linux에 대한 이전 답변입니다.

#!/bin/bash
for file
do  moddate=$(stat -c %y "$file")
    moddate=${moddate%% *} # 2015-10-26
    moddate=${moddate//-/} # 20151026
    if [[ "$file" =~ ([0-9]{8}).txt$ ]]
    then  if [[ $moddate > ${BASH_REMATCH[1]} ]]
          then echo "$file: modified $moddate"
          fi
    fi
done

bash =~정규식 연산자는 파일 이름의 8자리 숫자를 bash 배열 BASH_REMATCH에 캡처합니다. [[ ]]문자열을 비교하지만 [ -gt ].

답변4

또 다른 zsh방법:

zmodload zsh/stat # best in ~/.zshrc or
zmodload -F zsh/stat +b:zstat # to avoid overriding an eventual
                              # system stat command.
setopt extendedglob # best in ~/.zshrc

ls -ld -- **/*[0-9](#c8)*(De@'zstat -F %Y%m%d -A m +mtime $REPLY &&
  [[ ${(SM)${REPLY:t}#[0-9](#c8)} != $m ]]'@)

타임스탬프처럼 보이지만 마지막 수정 시간과 일치하지 않는 이름을 가진 파일이 보고됩니다.

zsh전역 변수 및 변수에 대해 작동하는 유사한 연산자가 많이 있습니다. 모든 작업을 신속하게(그리고 종종 안정적으로) 완료하는 것은 매우 편리하지만, 모든 것을 완전히 이해하기는 어렵고 흔히 결과라고 부르는 것을 생성하는 경우가 많습니다.그냥 써code(읽기 어려운 코드에 대한 완곡한 표현이지만 명령 프롬프트에서 단일 사용을 작성할 때 읽을 필요가 없음을 의미하기도 함)

간단히 살펴보면 다음과 같습니다.

  • **/pattern(qualifier): glob 한정자가 있는 재귀 glob입니다.
  • [0-9](#c8)8자리 숫자를 일치시킵니다. 이것은 kshs 와 동등한 zsh Extendedglob입니다 {8}([0-9]).
  • D: 숨겨진 파일이 포함되어 있습니다.
  • e@...@: 이것평가하다glob 한정자는 파일을 추가로 한정하기 위해 일부 텍스트를 실행합니다. 전달된 파일 경로$REPLY
  • zstat...배열에서 YYYYMMDD 형식으로 mtime을 검색합니다 $m.
  • ${REPLY:t}: 다음으로 확장파일의 꼬리(기본 이름)입니다.
  • ${(SM)something#pattern}. 일치하는 부분 추출무늬~에서무엇. 그것들 S(에스ubstring 검색) 및 M(다음으로 확장됨중간 사이즈첨부된 부분) 이라고 합니다.매개변수 확장 플래그.

관련 정보