편집하다

편집하다

이것이 일반적인 질문이라는 것을 알고 있지만 제공된 솔루션이 어떻게 작동하는지 이해하지 못합니다. 모든 사람들은 날짜를 epoch에서 초 단위로 변경한 다음 (24 * 3600)으로 나누어 일수 차이를 구할 것을 제안합니다. 또는 사용

if [ $first_date -gt $second_date ]

그러나 내가 이해하지 못하는 것은 하루 안에도 달라질 수 있기 때문에 신기원의 초를 사용할 때 명백한 오류를 아무도 눈치채지 못한 이유입니다. 또는 특정 날짜의 오후 5시 30분과 다음 날 오전 9시를 고려하면 초 단위의 차이로 인해 24시간의 차이가 발생하지 않으므로 같은 날로 잘못 간주됩니다.

내 사용 시나리오는 다음과 같습니다. 지정된 일 수보다 오래된 로그를 지워야 합니다. 따라서 expiration_date사용자가 입력한 일수를 수락한 후 구성된 것은 다음과 같습니다.

expiration_date=$(date -d "-$1 day" + %s)

명령을 사용하여 stat얻은 파일 수정 날짜 는 다음과 같습니다.

file_date=$( stat -c %Y $entry )

이 두 날짜를 비교하고 파일 수정 날짜가 만료 날짜보다 "이전"인 경우 이를 지워야 합니다. 이 점에 관해 저를 도와주세요.

편집하다

mtime명령 매개변수 사용법에 대해 매우 혼란스럽습니다 find. 다음과 같은 파일이 있다고 가정해 보겠습니다.

Nov15_1
Nov15_2
Nov17_1
Nov17_2
Nov18_1
Nov18_2
Nov19_1
Nov19_2
  • 지금 11월 19일에 as 매개변수를 find사용하여 명령을 실행하면 처음 4개 파일을 제외한 모든 파일이 제공됩니다. 0mtime
    $ find /dir/ -type f -mtime 0 -name "Nov*"
    Nov18_1
    Nov18_2
    Nov19_1
    Nov19_2
    
  • 를 사용하여 실행하면 +0처음 4개 파일만 제공됩니다.
    $ find /dir/ -type f -mtime +0 -name "Nov*"
    Nov15_1
    Nov15_2
    Nov17_1
    Nov17_2
    

mtime변수를 사용하여 이를 표현하는 경우, 매월 n일 이전의 로그를 지우고 as를 사용하여 (n+1)일에 명령을 실행한다고 가정하면 +0이 역시 "1일 전"으로 변환되어야 합니다. 추가"를 선택하면 실제로는 (n-1)일부터, 즉 "왕복 2일"부터 파일을 가져옵니다. 이는 어떻게든 1일 전과 그 이후의 파일을 가져올 수 없다는 의미입니까? 논쟁은 0혼합한다는 것입니다. 오늘의 문서와 함께요.

편집하다

-daystart그래서 @AdminBee가 지적한 옵션을 통합했는데 결과는 예상했던 대로였습니다. 이제 n일 이전의 로그를 삭제하기 위해 (n+1)일에 이 명령을 실행하면 명령은 다음과 같습니다.

find /dir/ -type f -daystart -mtime +0 -name "Nov*"

파일 수정 타임스탬프가 지금부터 24시간 이내인지 여부에 관계없이 이제 전날의 파일은 1일 뒤처진 것으로 간주되며 이전의 다른 모든 파일도 나열됩니다.

답변1

실제 사용 사례에 대한 자세한 내용을 제공해야 할 수도 있습니다. 매일 정리 스크립트를 실행하고 5일 이상(즉, 6일 이상)이 지난 모든 파일을 삭제하려고 한다고 가정합니다.

findfind이러한 경우 다음과 같이 (GNU 또는 호환 가정)을 사용하여 조건부 파일 검색 및 삭제 작업을 단일 명령으로 결합할 수 있습니다.

find /start/of/logfile/dir/structure ! -type d -daystart -mtime +5 -delete

2019-11-16 22:54:12 현지 시간에 실행하면 마지막 수정 시간이 2019-11-11 00:00:00 이전인 디렉터리가 아닌 파일이 삭제됩니다(따라서 10일 이전의 파일).

-daystart이 명령에 대한 옵션 은 find원하는 동작을 달성해야 합니다. 작업을 특정 파일 이름 부분으로 제한해야 하는 경우 다음을 추가해야 합니다 -name <pattern>(참조GNU 문서find).

find또한 컴퓨터에 설치된 버전에 따라 -delete작업이이용이 불가능할 수도 있습니다, 그래서 대신에 그것을 사용해야 할 수도 있습니다 -exec rm {} \;.

답변2

man find, -시간:

...따라서 -atime +1과 일치하려면 최소한 이틀 전에 파일에 액세스해야 합니다.

옵션 -daystart변경 설명:

-daystart
 Measure times (for -amin, -atime, -cmin, -ctime, -mmin, and  -mtime)
 from the beginning of today rather than from 24 hours ago.  

touch -d '2019-11-19 0800' thismorning테스트 파일을 쉽게 만들 수 있습니다.

]# find -name '*n*g*' -daystart -mtime 0 -ls 
      Nov 19 08:00 ./thismorning
]# find -name '*n*g*' -daystart -mtime 1 -ls 
      Nov 18 22:30 ./lastnight
      Nov 18 08:30 ./lastmorning
]# find -name '*n*g*'  -mtime 0 -ls 
      Nov 18 22:30 ./lastnight
      Nov 19 08:00 ./thismorning
]# find -name '*n*g*'  -mtime 1 -ls 
      Nov 17 22:00 ./lastlastnight
      Nov 18 08:30 ./lastmorning

(-ls 출력 필드를 잘라냈습니다. 날짜와 파일 이름만 남았습니다)

]# find -name '*n*g*'; date         
./lastnight
./thismorning
./lastlastnight
./lastmorning
Tue Nov 19 10:34:33 UTC 2019
]# find -name '*n*g*' -daystart -mtime 2 -ls 
   Nov 17 22:00 ./lastlastnight
]# 

...OP에서 달력 날짜와 24시간 기간을 혼동했기 때문입니다. 우리는 이것을 원할 때도 있고 저것을 원할 때도 있습니다.

왜 에포크 이후 몇 초가 지났나요?

어떤 일이 얼마나 오래 지속되었는지, 즉 두 날짜의 차이를 알고 싶다면 우리 달력에 이러한 불규칙성(월)이 있습니다. 따라서 손가락 관절을 사용하여 율리우스 황제와 아우구스투스 황제에 대해 배우거나 무차별 대입을 통해 몇 초를 보내십시오.

30.7부터 시작됩니다. 1.9로. 30.1보다 3일 더 길어졌습니다. 1.3.까지이며 심지어 윤년에 따라 달라집니다.

today, 5:30 pm그리고 tomorrow 6:00 am

  • 다른 요일(캘린더 방식)
  • 반나절 간격(1일 = 24x60x60초 기간)

만료 날짜에서 계산하려는 24시간 기간을 뺍니다. 이는 오전 1시에 대부분의 "어제"가 영향을 받지 않음을 의미합니다.

date명령을 테스트하고 수정했습니다.

]# date -d "-1 day" +%s
1574003538
]# date -d "-0 day" +%s
1574089945

차이점은 86407, 즉 24x60x60입니다.

(누군가가 나에게 "무슨 일을 하고 있나요 date -d @1574089945?"라고 묻는다면 나는 "명령을 편집하고 있습니다"라고 말할 수 있습니다.7초")


]# find . -atime 1
./here.sh
]# find . -atime +0 -atime -2
./here.sh
]# ls -l here.sh 
-rw-r--r-- 1 root root 154 Nov 16 21:37 here.sh

그것은 Nov 18 16:43. 따라서 둘 사이에는 완전한 24시간의 기간이 있습니다.

관련 정보