수학 문제인지 변수 값 문제인지 잘 모르겠습니다

수학 문제인지 변수 값 문제인지 잘 모르겠습니다

신기원 시간을 비교하는 데 문제가 있습니다. 내가 뭘 잘못하고 있는지 잘 모르겠습니다. 내 임무는 특정 날짜 범위 밖의 파일을 식별하고 처리하는 것입니다.

이 경우 정리 스크립트입니다. 검색하려면 몇 가지 매개변수가 필요하며 날짜를 확인합니다. 내 날짜는 다음과 같습니다.

파일을 삭제할 수 있는 가장 빠른 날짜 -> date -d "-30days" +"%s"
파일을 압축할 수 있는 가장 빠른 날짜 -> date -d "-14days" +"%s"
파일의 마지막 수정 시간 가져오기: stat -c "%y" "/path/to/file"
마지막 수정 시간의 에포크를 가져옵니다.date -d "<from the obtained time from stat>" +"%s"

수학은 다음과 같습니다.

if (( FILE_TIMESTAMP >= EARLIEST_DELETE_DATE ))
then
    delete file;
elif (( FILE_TIMESTAMP >= EARLIEST_COMPRESS_DATE ))
then
    compress file;
else
    echo "file skipped as it wasnt in teh date ranges";
fi

(위 코드 편집: 여기서 <= EARLIEST_DELETE_DATE에 대한 확인을 제거했습니다.)

첫 번째 if 문은 예상대로 작동합니다. 두 번째는 중간에 작동합니다. 타임스탬프가 압축된 날짜보다 크다는 것을 인식하지만 삭제된 날짜보다 작은 날짜에 대한 검사는 코드의 해당 부분이 실행되지 않기 때문에 false를 반환하는 것 같습니다.

제가 계산을 잘못한 걸까요, 아니면 변수가 잘못된 걸까요?

또한 내 게시물이 쓰레기라는 것도 알고 있습니다. 커뮤니티에 대한 부담을 덜기 위해 이후에는 내 계정을 삭제하겠습니다.

일부 업데이트:

내 디버그 로그 출력을 보면 다음과 같습니다.

[Time: ][Thread: 883837][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:99] [Method: manageFileLifecycle.sh] - FILE_DATESTAMP -> 2023-05-07 03:20:29.000000000 -0400 [Time: ][Thread: 883837][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:100] [Method: manageFileLifecycle.sh] - FILE_TIMESTAMP -> 1683444029

표시된 파일은 6개월보다 오래되었지만 >= delete 절에 의해 트리거되지 않았습니다. 내가 뭘 잘못했는지 잘 모르겠어

@markp-fuso의 경우:

declare -- FILE_TIMESTAMP="1688178017"
declare -i EARLIEST_DELETE_DATE="1697037095"
declare -i EARLIEST_COMPRESS_DATE="1698419495"
FILE_TO_PROCESS -> /opt/cws/log/S93206319.log, FILE_DATESTAMP -> 2023-06-30 22:20:17.000000000 -0400 FILE_TIMESTAMP -> 1688178017, EARLIEST_DELETE_DATE -> 1697037095, EARLIEST_COMPRESS_DATE -> 1698419495

로그 출력에서는 파일을 건너뛰면 안 되지만 건너뛰는 것을 볼 수 있습니다.

그리고 죄송합니다. 스크립트 전체는 회사 자산이므로 공유할 수 없습니다 =(

추가 정보:

특정 파일 추출이 작동하지 않습니다.

declare -- FILE_TIMESTAMP="1679107439"
declare -i EARLIEST_DELETE_DATE="1697040305"
declare -i EARLIEST_COMPRESS_DATE="1698422705"
FILE_TO_PROCESS -> /opt/cws/log/S93382366.log, FILE_DATESTAMP -> 2023-03-17 22:43:59.000000000 -0400 FILE_TIMESTAMP -> 1679107439, EARLIEST_DELETE_DATE -> 1697040305, EARLIEST_COMPRESS_DATE -> 1698422705
file skipped as it wasnt in teh date ranges

그리고

[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:93] [Method: manageFileLifecycle.sh] - processRequestedFile -> enter
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:94] [Method: manageFileLifecycle.sh] - Provided arguments: /opt/cws/log/S93382366.log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:95] [Method: manageFileLifecycle.sh] - ERROR_COUNT -> 0
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:96] [Method: manageFileLifecycle.sh] - FILE_TO_PROCESS -> /opt/cws/log/S93382366.log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:97] [Method: manageFileLifecycle.sh] - FILE_CORE_NAME -> S93382366
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:98] [Method: manageFileLifecycle.sh] - FILE_CORE_EXT -> log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:99] [Method: manageFileLifecycle.sh] - FILE_DATESTAMP -> 2023-03-17 22:43:59.000000000 -0400
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:100] [Method: manageFileLifecycle.sh] - FILE_TIMESTAMP -> 1679107439
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:107] [Method: manageFileLifecycle.sh] - FILE_CORE_EXT and FILE_CORE_NAME do not match - executing with a file extension
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:139] [Method: manageFileLifecycle.sh] - File has extension log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:298] [Method: manageFileLifecycle.sh] - RETURN_CODE -> 0
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:299] [Method: manageFileLifecycle.sh] - processRequestedFile -> exit

적어도 삭제 절이 파일에 영향을 미치는 것 같습니다.

조판 출력:

declare -- FILE_TIMESTAMP="1703308529"
declare -i EARLIEST_DELETE_DATE="1697040305"
declare -i EARLIEST_COMPRESS_DATE="1698422705"
FILE_TO_PROCESS -> /opt/cws/log/S20504215.log, FILE_DATESTAMP -> 2023-12-23 00:15:29.000000000 -0500 FILE_TIMESTAMP -> 1703308529, EARLIEST_DELETE_DATE -> 1697040305, EARLIEST_COMPRESS_DATE -> 1698422705

디버그 로그의 출력:

[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:93] [Method: manageFileLifecycle.sh] - processRequestedFile -> enter
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:94] [Method: manageFileLifecycle.sh] - Provided arguments: /opt/cws/log/S20504215.log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:95] [Method: manageFileLifecycle.sh] - ERROR_COUNT -> 0
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:96] [Method: manageFileLifecycle.sh] - FILE_TO_PROCESS -> /opt/cws/log/S20504215.log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:97] [Method: manageFileLifecycle.sh] - FILE_CORE_NAME -> S20504215
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:98] [Method: manageFileLifecycle.sh] - FILE_CORE_EXT -> log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:99] [Method: manageFileLifecycle.sh] - FILE_DATESTAMP -> 2023-12-23 00:15:29.000000000 -0500
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:100] [Method: manageFileLifecycle.sh] - FILE_TIMESTAMP -> 1703308529
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:107] [Method: manageFileLifecycle.sh] - FILE_CORE_EXT and FILE_CORE_NAME do not match - executing with a file extension
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:139] [Method: manageFileLifecycle.sh] - File has extension log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:143] [Method: manageFileLifecycle.sh] - File timestamp is greater than or equal to the delete date. File -> /opt/cws/log/S20504215.log, Timestamp -> 1703308529, EARLIEST_DELETE_DATE -> 1697035331
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:148] [Method: manageFileLifecycle.sh] - Deleting file /opt/cws/log/S20504215.log as it falls after the earliest delete date range.
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: processRequestedFile:149] [Method: manageFileLifecycle.sh] - EXEC: deleteRequestedFile /opt/cws/log/S20504215.log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:462] [Method: manageFileLifecycle.sh] - deleteRequestedFile -> enter
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:463] [Method: manageFileLifecycle.sh] - Provided arguments: /opt/cws/log/S20504215.log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:464] [Method: manageFileLifecycle.sh] - REMOVABLE_FILE -> /opt/cws/log/S20504215.log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:465] [Method: manageFileLifecycle.sh] - REMOVABLE_FILE_NAME -> S20504215.log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:466] [Method: manageFileLifecycle.sh] - REMOVABLE_FILE_PATH -> /opt/cws/log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:470] [Method: manageFileLifecycle.sh] - Checking if /opt/cws/log exists...
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:516] [Method: manageFileLifecycle.sh] - Returning to previous directory /opt/cws/log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:520] [Method: manageFileLifecycle.sh] - Previous directory: /opt/cws/log, New working directory: /opt/cws/log
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:530] [Method: manageFileLifecycle.sh] - RETURN_CODE -> 1
[Time: ][Thread: 8066][Log: debug.log][Level: DEBUG] - [File: deleteRequestedFile:531] [Method: manageFileLifecycle.sh] - deleteRequestedFile -> exit

목표는 현재 날짜로부터 30일보다 오래된 모든 파일을 삭제하고, 현재 날짜로부터 14일 이상 30일 미만의 파일을 압축하는 것입니다(이 항목은 삭제 범위에 속합니다). 14일 남았습니다.

답변1

당신의 논리가 잘못되었습니다. 너 그거 치료하고 있어?타임스탬프마치 그들이 그랬던 것처럼나이. 해야 한다:

if (( FILE_TIMESTAMP < EARLIEST_DELETE_DATE ))
then
    delete file
elif (( FILE_TIMESTAMP < EARLIEST_COMPRESS_DATE ))
then
    compress file
else
    echo "file skipped as it wasn't in the date ranges"
fi

휴대용 작업을 위해 다음 명령을 사용할 수도 있습니다 find.

find -- "$file" -prune -mtime +29 -exec rm -f -- {} + -o \
  -mtime +13 -exec gzip -- {} + -o \
  -exec echo Skipping {} +

있기는 하지만 --(or,, )로 시작하는 값에 대해서는 이 방법이 실패한다는 점에 유의하세요. 호출되는 파일에도 문제가 있습니다(파일을 표준 입력으로 처리합니다. GNU에서도 마찬가지입니다).$file-()!gzip-stat

-mtime +29이는 정수로 반올림되어 29일보다 큰 파일, 즉 30일 이상 지난 파일의 경우에 해당됩니다.

BSD 의 경우 find다음을 수행하여 문제/혼란을 모두 해결할 수 있습니다.

find -f "$file" -prune -mtime +30d -exec rm -f -- {} + -o \
  -mtime +14d -exec gzip -- {} + -o \
  -exec echo Skipping {} +

( d접미사 참고).

최신 버전의 GNU를 사용하더라도 find다음을 수행할 수 있습니다.

find  -files0-from <(printf '%s\0' "$file") -prune \
  ! -newermt '30 days ago' -exec rm -f -- {} + -o \
  ! -newermt '14 days ago' -exec gzip -- {} + -o \
  -printf 'Skipping %p\n'

하다아니요사용자는 -delete힌트를 따르고 -exec rm -f {} +명령의 성공/실패가 논리에 사용되므로 이러한 명령의 처음 2초 동안 대체를 사용하지 않습니다.-delete-depth-exec ... ';'-exec ... +-execfind

이러한 모든 명령은 여러 파일을 처리할 수 있습니다(BSD의 find경우 -f "$file1" -f "$file2"...).

답변2

문제가 끝나면 다음과 같은 규칙이 있습니다.

  • 현재 날짜로부터 30일이 지난 모든 파일을 삭제합니다.
  • 현재 날짜로부터 14일 이상 30일 이하의 모든 파일을 압축합니다(이 항목은 삭제됩니다).
  • 14일이 지나지 않은 모든 파일은 유지됩니다.

최신 업데이트에서 우리는 두 가지 에포크 값 세트를 얻었습니다.

filename: /opt/cws/log/S93382366.log

        FILE_TIMESTAMP="1679107439"      # Fri Mar 17 21:43:59 CDT 2023
  EARLIEST_DELETE_DATE="1697040305"      # Wed Oct 11 11:05:05 CDT 2023
EARLIEST_COMPRESS_DATE="1698422705"      # Fri Oct 27 11:05:05 CDT 2023

    code result: ISN'T working (assuming this means code generates "file skipped as it wasnt in the date ranges")

expected result: delete file (more than 30 days old; NOTE: compression should have occurred a long time ago)

-----------

filename: /opt/cws/log/S20504215.log

        FILE_TIMESTAMP="1703308529"      # Fri Dec 22 23:15:29 CST 2023
  EARLIEST_DELETE_DATE="1697040305"      # Wed Oct 11 11:05:05 CDT 2023
EARLIEST_COMPRESS_DATE="1698422705"      # Fri Oct 27 11:05:05 CDT 2023

    code result: delete file

expected result: file skipped as it wasn't in the date ranges (less than 14 days old; actually, file has timestamp that is 42 days in the future when today = Nov 10 2023)

코드의 주요 문제:

  • "오래된" 신기원 날짜는 실제로더 적은"최근" 시대 날짜보다...
  • 코드는 다음 기간 동안 테스트되어야 합니다.더 적은원하는 임계값을 초과함

현재 코드를 수정하여 원하는 3가지 규칙을 구현하세요.

if (( FILE_TIMESTAMP < EARLIEST_DELETE_DATE ))
then
    echo "delete file"
elif (( FILE_TIMESTAMP < EARLIEST_COMPRESS_DATE ))
then
    echo "compress file"
else
    echo "file skipped as it wasn't in the date ranges";
fi

이것을 2개의 예제 파일/에포크 그룹에 적용하면 다음과 같은 결과를 얻습니다.

filename: /opt/cws/log/S93382366.log

        FILE_TIMESTAMP="1679107439"      # Fri Mar 17 21:43:59 CDT 2023
  EARLIEST_DELETE_DATE="1697040305"      # Wed Oct 11 11:05:05 CDT 2023
EARLIEST_COMPRESS_DATE="1698422705"      # Fri Oct 27 11:05:05 CDT 2023

code result: delete file

-----------

filename: /opt/cws/log/S20504215.log

        FILE_TIMESTAMP="1703308529"      # Fri Dec 22 23:15:29 CST 2023
  EARLIEST_DELETE_DATE="1697040305"      # Wed Oct 11 11:05:05 CDT 2023
EARLIEST_COMPRESS_DATE="1698422705"      # Fri Oct 27 11:05:05 CDT 2023

code result: file skipped as it wasn't in the date ranges

관련 정보