파일이 x보다 오래 전에 생성되었는지 bash에서 어떻게 확인합니까?


106

파일이 x 이상 생성되었는지 Linux bash에서 확인하고 싶습니다.

파일 이름이 text.txt이고 시간이 2 시간이라고 가정 해 보겠습니다.

 if [ what? ]
 then
     echo "old enough"
 fi

답변:


138

수정 시간에만

if test `find "text.txt" -mmin +120`
then
    echo old enough
fi

-cmin변경 또는 -amin액세스 시간에 사용할 수 있습니다 . 다른 사람들이 지적했듯이 생성 시간을 추적 할 수 없다고 생각합니다.


3
'테스트'와 백틱을 삭제할 수 있습니다. 이것은 유사에 '경우 (테스트 == true)가'대 '경우 (테스트)'

2
당신이 맞습니다. find일치하는 항목이 없을 때 0이 아닌 값 을 반환 한다고 생각했습니다 .
guns

4
백틱을 삭제하고 테스트 $ (find text.txt -mmin +120)
tommy.carstensen tommy.carstensen

1
@BroSlow 더보기 : "하나 이상"이 가능 하지 않습니다 . 물론, text.txt디렉토리가 아닌 것으로 추정됩니다.
kmkaplan 2014

2
나는이 구문을 선호한다 :[ "$(find path/to/file -mmin +120)" ] && echo "it is old"
Alfe

42

나는 항상 date -r /the/file +%s나이를 찾기 위해 사용 하는 것을 좋아했습니다 .

또한 touch --date '2015-10-10 9:55' /tmp/file임의의 날짜 / 시간에 대해 매우 세분화 된 시간을 얻을 수 있습니다 .


나는 오늘도 같은 것을 찾고 있었다. 베스트!
Umair A. 2014 년

감사. "파일 bash의 나이를 인쇄하는 방법"을 검색했기 때문에이 질문에 착수했습니다. 그래서 이것이 바로 제가 찾던 것입니다!
Noah Sussman 2015 년

5
감사! 위에서 소인 (되지 연령)이지만과 같이 세 CALC하는데 사용될 수있는 유일한 경고와 let AGE=$(($(date +%s)-$(date -r /path/to/file +%s))) [생성 결코 수정 또는 "개조 연령 관련된"이라는 가정하에]
nhed

function file-age { FILE_CREATED_TIME=`date -r "$1" +%s`; TIME_NOW=`date +%s`; echo "$[ ${TIME_NOW} - ${FILE_CREATED_TIME} ]"; }
turiyag

1
@turiyag 필수 참고 사항 $[ ]더 이상 사용 되지 않는 경우 적어도 오래되고 덜 이식 가능 하며 $(( ))대신 사용해야 합니다. 역 따옴표는보다 취약합니다 $( ). 또한 함수 이름의 하이픈은 완전히 이식 할 수 없습니다. 그러나 그것의 본질은 좋습니다!
michaelb958--GoFundMonica

23

를 사용하여 stat파일의 마지막 수정 날짜 date를 파악하고, 현재 시간과 bashisms의 자유로운 사용을 파악하기 위해 파일의 마지막 수정 시간을 기반으로 원하는 테스트를 수행 할 수 있습니다 1 .

if [ "$(( $(date +"%s") - $(stat -c "%Y" $somefile) ))" -gt "7200" ]; then
   echo "$somefile is older then 2 hours"
fi

코드는 find접근 방식 보다 약간 덜 읽기 쉽지만 find이미 "찾은"파일을보기 위해 실행 하는 것 보다 더 나은 접근 방식이라고 생각합니다 . 또한 날짜 조작은 재미 있습니다 ;-)


  1. Phil이 올바르게 지적했듯이 생성 시간은 기록되지 않지만 아래 %Z대신 사용 %Y하여 원하는 "시간 변경"을 얻을 수 있습니다.

[최신 정보]

Mac 사용자 stat -f "%m" $somefile의 경우 위의 Linux 특정 구문 대신 사용


날짜와 통계는 어떤 셸에 내장되어 있습니까? 내 bash (GNU, 3.2.48)에는 그것들이 없습니다.
Ian Clelland

앗 미안 해요. stat내장되어 있지 않습니다-나에게 매우 나쁩니다.
Guss

1
@Guss 올바른 해결책은 brew와 함께 coretutils를 설치하는 것입니다. :-)
Erik Johansson

1
@ErikJohansson 기존 소프트웨어를 사용할 때 추가 소프트웨어를 설치할 필요가 없습니다. Windows가 아닙니다. ;-)
Guss

1
이것을 사용하고 싶지만 수정하려는 사람들에게는 그것이 무엇을하는지 정확히 아는 것이 좋습니다 : $ (($ (date + "% s")-1970-01-01 00:00:00 UTC 이후의 초) (Epoch) $ (stat -c "% Y"$ somefile)))-Epoch -gt "7200"이후 마지막 수정 시간 (초)-차이가 x 초보다 큰지 확인합니다.
devo

16

생성 시간은 저장되지 않습니다.

저장되는 것은 세 가지 타임 스탬프입니다 (일반적으로 특정 파일 시스템 또는 특정 파일 시스템 옵션에 의해 해제 될 수 있음).

  • 마지막 액세스 시간
  • 마지막 수정 시간
  • 마지막 변경 시간

파일에 대한 "변경"은 권한 변경, 이름 변경 등으로 간주됩니다. 수정은 내용 일뿐입니다.


12

ctime은 기술적 으로는 창조의 시간 이 아니지만 꽤 자주 그렇습니다 .

ctime은 파일 내용 변경의 영향을받지 않기 때문에 일반적으로 파일이 생성 될 때만 업데이트됩니다. 그리고 예-비명을 지르는 소리를들을 수 있습니다. 액세스 권한이나 소유권을 변경하면 업데이트됩니다.하지만 일반적으로 한 번 수행되며 일반적으로 파일을 거기에 넣는 동시에 수행됩니다.

개인적으로 나는 항상 모든 것에 mtime을 사용하고 그것이 당신이 원하는 것이라고 상상합니다. 하지만 어쨌든 ... 여기 Guss의 "매끄럽지 않은"bash를 사용하기 쉬운 기능으로 다시 해시했습니다.

#! / bin / bash
function age () {
   로컬 파일 이름 = $ 1
   local changed =`stat -c % Y "$ filename"`
   현재 지역 =`날짜 + % s`
   로컬 경과

   let elapsed = 지금 변경됨
   에코 $ elapsed
}

파일 = "/"
echo $ file의 나이는 $ (age "$ file") 초입니다.

이것은 유용했지만 OSX에서 통계가 다르게 구현 되었기 때문에 즉시 작동하지 않았습니다. 내가 찾은 유일한 교차 시스템 호환 방법은 perl을 사용하는 것입니다. :이와 해당 라인을 교체하는 경우 스크립트는 맥에서 작동해야 local changed=$(perl -MFile::stat -e "print stat(\"${filename}\")->mtime") superuser.com/questions/427551/...
비쥬 우연히 찾아 낸 행운

1
"창조 시간"은 이해하기 어려운 개념입니다. 복사 된 파일은 무엇을 의미합니까? 이동 된 파일은 무엇입니까? 장치 경계를 넘어 이동 한 경우 (어떤 의미에서 새로 생성 된 경우) 어떻게됩니까? 패키지화되고 나중에 패키지화되지 않은 파일은 무엇을 의미합니까? 여기에서 몇 가지 답변이 가능하며 합의가 없습니다. 그러나 ctime을 언급하는 것은 좋지만 "창조 시간"이라는 모호한 개념에 의미 론적으로 가깝게 두지 않을 것입니다. 특히 chmod파일에 적용된 간단한 은 그 아이디어를 무효화합니다. 그러나 나는 살 수 ;-) 그 일을
에 AlFe

@Alfe : +%s하반기에서 누락되었습니다
Grizly

그 나이는 훨씬 더 짧을 수 있습니다 : age() { echo $(( $(date +%s) - $(date -r "$1" +%s) )); } (수정을 위해 @Grizly에게 감사드립니다!)
Alfe

실제로 noatime옵션으로 마운트 된 모든 파일 시스템에서 생성 시간 인 액세스 시간을 사용 하는 것이 좋습니다 (성능에 좋으므로 사용해야 함). 따라서 %X대신 %Y.
Nux

7

찾기는 좋지만 다른 방법으로 사용할 수 있다고 생각합니다. 특히 파일이 몇 초 오래 되었습니까?

date -d "now - $( stat -c "%Y" $filename ) seconds" +%s

GNU 날짜 사용


사용 gstat "로 coreutils를 설치 BREW"
에릭 요한슨

3

도구 'stat'의 결과를 고려하십시오.

  File: `infolog.txt'
  Size: 694         Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 11635578    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     fdr)   Gid: ( 1000/     fdr)
Access: 2009-01-01 22:04:15.000000000 -0800
Modify: 2009-01-01 22:05:05.000000000 -0800
Change: 2009-01-01 22:05:05.000000000 -0800

여기에서 액세스 / 수정 / 변경에 대한 세 가지 날짜를 볼 수 있습니다. 생성 된 날짜가 없습니다. 파일 내용이 수정 된시기 ( "modify"필드) 또는 해당 inode가 변경된시기 ( "change"필드) 만 실제로 확인할 수 있습니다.

두 필드가 모두 업데이트되는 경우의 예 :

누군가 추가 정보를 파일 끝에 연결하면 "수정"이 업데이트됩니다.

누군가가 chmod를 통해 권한을 변경하면 "변경"이 업데이트됩니다.


stat는 관련 정보를 알려줄 수 있습니다. 그러나 우리가 원하는 것을 얻기 위해 파싱하는 것은 매우 지루할 것입니다.
PypeBros

0

나는 사용한다

file_age() {
    local filename=$1
    echo $(( $(date +%s) - $(date -r $filename +%s) ))
}

is_stale() {
    local filename=$1
    local max_minutes=20
    [ $(file_age $filename) -gt $(( $max_minutes*60 )) ]
}

if is_stale /my/file; then
    ...
fi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.