find 명령으로 초 단위로 새로 고침 비교하고 싶습니다.

6277 단어 ShellScriptUNIX

-mmin은 있어도 -msec는 없는 것인가!



find 명령은 다양한 조건에서 파일 추출을 할 수있어 편리합니다. 하지만 시간의 신구에서 좁히는 기능은 약하다고 말할 수밖에 없다.

통상의 타임 스탬프(m:파일의 내용을 수정한 일시)에 있어서, POSIX로 규정되고 있는 것은 -mtime 뿐이며, 게다가 뒤에는 단순한 숫자 밖에 지정할 수 없다. 즉 현재로부터 1일(=86400초) 단위로의 신구 비교 밖에 할 수 없다.
  • 지정된 연월 일시 분초보다 새로운, 더 낡은, 같다
  • n 초 전보다 새로운, 더 오래된, 같음

  • 얼마나 비교하고 싶어도 할 수 없었다. 독자적인 옵션도 사용하면 어느 정도 할 수 있지만 OS에 의해서 사용할 수 있거나 사용할 수 없거나 하고… 그럼 어떻게 해보자.

    -newer 옵션을 활용하는 것이 열쇠



    그러나 -newer 라는 옵션을 사용하면 겨우 이 고민을 해결할 수 있다. 이것은 -newer의 뒤에서 지정한 파일을과 타임 스탬프 비교를 실시해, 그것보다 새롭으면 참으로 한다고 하는 기능을 가지는 옵션이다.

    1. 지정 일시와의 비교



    이것을 사용하면 우선, 지정 일시와의 비교는 간단하게 할 수 있다.

    YYYY/MM/DD hh ss 보다 새로운 파일을 추출하고 싶다면, 이런 쉘 스크립트를 쓰면 된다.
    touch -t YYYYMMDDhhmm.ss thattime.tmp
    find /TARGET/DIR -newer thattime.tmp
    rm thattime.tmp
    

    touch 명령의 서식의 사정에 의해, mm와 ss의 사이에 마침표를 꽂지 않으면 안되는 점에 주의해 주었으면 한다.

    다음에 "더 오래된"것을 추출하고 싶은 경우에 어떻게 하는가? 그것에는 기준이 되는 일시의 1초전( YYYYMMDDhhmms1 로 한다)의 타임 스탬프를 가지는 파일을 만들어, -newer 옵션의 부정형을 사용하면 된다.
    touch -t YYYYMMDDhhmm.s1 1secbefore.tmp # 基準日時の1秒前
    find /TARGET/DIR \( \! -newer 1secbefore.tmp \)
    rm 1secbefore.tmp
    

    그러면 「같다」라고 하고 싶다면 어떻게 하면 좋을까. 여기에는 기준일시의 파일과 그 1초 전의 파일의 2개를 만들어, 「기준일시 1초전보다 새로운」 또한 「기준일시를 포함한 그 이전」이라고 하는 조건으로 하면 된다.
    touch -t YYYYMMDDhhmm.ss thattime.tmp
    touch -t YYYYMMDDhhmm.s1 1secbefore.tmp
    find /TARGET/DIR -newer 1secbefore.tmp \( \! -newer thattime.tmp \)
    rm 1secbefore.tmp thattime.tmp
    

    2.n초 전보다 새로운, 오래된, 같음



    기준 일시와의 신구 ​​비교의 방법을 알 수 있었으므로, 나머지는 현재 일시의 n초전, 및 n-1초전이라고 하는 계산을 할 수 있으면 실현할 수 있게 된다.

    그것은 어떻게 하는가 하면, 쉘 스크립트로 시간 계산을 한 사람 앞에 해소 으로 쓰고 있었다. 그래, 일상시간(YYYYMMDDhhmmss)을 UNIX시간으로 변환해 뺄 수 있고, 그것을 원래대로 되돌리면 좋다. 그리고 그 때문에 POSIX 범위에서 움직이는 명령 "utconv"을 자작하고 있었던 것이다.

    그럼 1분 30초 전보다 새로운, 같고, 낡은 파일을 추출하는 쉘 스크립트를 써 보자.

    1분 30초 전부터 새 파일 추출
    now=$(date '+%Y%m%d%H%M%S')
    t0=$(echo $now                |
         utconv                   |
         awk '{print $0-60*1-30}' |
         utconv -r                |
         sed 's/..$/.&/'          )
    touch -t $t0 thattime.tmp
    find /TARGET/DIR -newer thattime.tmp
    rm thattime.tmp
    

    1분 30초 전보다 오래된 파일 추출
    now=$(date '+%Y%m%d%H%M%S')
    t1=$(echo $now                |
         utconv                   |
         awk '{print $0-60*1-31}' |
         utconv -r                |
         sed 's/..$/.&/'          )
    touch -t $t1 1secbefore.tmp
    find /TARGET/DIR \( \! -newer 1secbefore.tmp \)
    rm 1secbefore.tmp
    

    1분 30초 전의 파일 추출
    now=$(date '+%Y%m%d%H%M%S')
    t0=$(echo $now                |
         utconv                   |
         awk '{print $0-60*1-30}' |
         utconv -r                |
         sed 's/..$/.&/'          )
    t1=$(echo $now                |
         utconv                   |
         awk '{print $0-60*1-31}' |
         utconv -r                |
         sed 's/..$/.&/'          )
    touch -t $t0 thattime.tmp
    touch -t $t1 1secbefore.tmp
    find /TARGET/DIR -newer 1secbefore.tmp \( \! -newer thattime.tmp \)
    rm thattime.tmp 1secbefore.tmp
    

    좋은 웹페이지 즐겨찾기