이것이 일반적인 질문이라는 것을 알고 있지만 제공된 솔루션이 어떻게 작동하는지 이해하지 못합니다. 모든 사람들은 날짜를 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개 파일을 제외한 모든 파일이 제공됩니다.0
mtime
$ 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일 이상)이 지난 모든 파일을 삭제하려고 한다고 가정합니다.
find
find
이러한 경우 다음과 같이 (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시간의 기간이 있습니다.