X일보다 오래된 YYYY-MM-DD라는 디렉터리를 찾아 해당 디렉터리가 있으면 삭제합니다.

X일보다 오래된 YYYY-MM-DD라는 디렉터리를 찾아 해당 디렉터리가 있으면 삭제합니다.

X파일 이름을 기준으로 며칠보다 오래된 디렉터리를 찾아 삭제하는 라이너 bash 스크립트를 만들어 보았으며 디렉터리가 존재하면 코드가 완벽하게 작동합니다. 유일한 문제는 디렉토리가 존재하지 않으면 디렉토리를 삭제하려고 시도하고 오류가 발생한다는 것입니다.

find: ‘/var/www/html/resources/cache/2022-02-08’: No such file or directory

find 명령 결과에 디렉터리가 존재하는지 확인하고 삭제하라는 조건을 넣었지만.

find '/var/www/html/resources/cache/' -type d -name '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]' -exec sh -c 'd={}; [ "$(date -d "6 days ago" +%Y-%m-%d)" ">" "$(basename $d)" ] && [ -d $d ] && rm -rf $d' \;

다음 디렉토리가 다음 위치에 있다고 가정해 보겠습니다./var/www/html/resources/cache

2022-02-08
2022-02-09
2022-02-10
2022-02-11
2022-02-12
2022-02-13
2022-02-14
2022-02-15

[ "$(date -d "6 days ago" +%Y-%m-%d)" ">" "$(basename $d)" ]파일 이름이 6일보다 오래되었는지 확인하세요.

[ -d $d ]디렉터리인지 확인하세요.

답변1

옵션 xargs대신 명령을 사용할 수 있습니다 .-execfind

find '/var/www/html/resources/cache/' -type d -name '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]' | xargs -I {} sh -c 'd={}; [ "$(date -d "6 days ago" +%Y-%m-%d)" ">" "$(basename $d)" ] && [ -d $d ] && rm -rf $d'

위의 코드 블록은 작동하지만 123값으로 반환될 수 있습니다. 반복되는 명령에 대해 오류가 발생하면 xargs명령이 반환됩니다 . 123따라서 6일이 지나지 않은 디렉터리 이름이 있으면 오류가 발생합니다.

find '/var/www/html/resources/cache/' -type d -name '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]' | xargs -I {} sh -c 'd={}; if [ "$(date -d "6 days ago" +%Y-%m-%d)" ">" "$(basename $d)" ]; then [ -d $d ] && rm -rf $d; fi'

if조건을 명령문으로 대체하여 이 문제를 해결할 수 있습니다 .

답변2

6일 전 날짜를 초로 변환하고, 디렉터리 이름을 초로 변환하고, 직접 숫자 비교를 수행할 수 있습니다. 최상위 디렉토리만 고려하고 있으므로 전혀 필요하지 않습니다 find. 표준 루프를 사용하여 디렉토리를 반복하면 됩니다.

ago=$(date --date "6 days ago" +%s)
for dir in /var/www/html/resources/cache/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]
do
    [ -d "$dir" ] || continue

    this=$(date --date "${dir##*/}" +%s)
    [ $this -lt $ago ] && echo "DELETE $dir"
done

find이 버전을 정말로 사용하려면 GNU find또는 기타 이해할 수 있는 버전이 필요합니다 -maxdepth. (없으면 find시뮬레이션하는 방법이 있습니다 -maxdepth.)

find /var/www/html/resources/cache -maxdepth 1 -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]" -exec sh -c '
    ago=$(date --date "6 days ago" +%s)
    for dir in "$@"
    do
        this=$(date --date "${dir##*/}" +%s)
        [ $this -lt $ago ] && echo "DELETE $dir"
    done
' _ {} +

두 가지 옵션의 출력

DELETE /var/www/html/resources/cache/2022-02-08
DELETE /var/www/html/resources/cache/2022-02-09

준비가 되면 진술을 원하는 대로 echo변경 하세요.rm -rf

답변3

타임스탬프가 있는 디렉터리를 테스트합니다.

~] ls -alFh
drwxr-xr-x 11 root root 4.0K Feb 15 10:51 ./
drwxr-xr-x  3 root root 4.0K Feb 15 10:51 ../
drwxr-xr-x  2 root root 4.0K Feb 15 10:51 2022-02-08/
drwxr-xr-x  2 root root 4.0K Feb 15 10:51 2022-02-09/
drwxr-xr-x  2 root root 4.0K Feb 15 10:51 2022-02-10/
drwxr-xr-x  2 root root 4.0K Feb 15 10:51 2022-02-11/
drwxr-xr-x  2 root root 4.0K Feb 15 10:51 2022-02-12/
drwxr-xr-x  2 root root 4.0K Feb 15 10:51 2022-02-13/
drwxr-xr-x  2 root root 4.0K Feb 15 10:51 2022-02-14/
drwxr-xr-x  2 root root 4.0K Feb 15 11:01 2022-02-15/
drwxr-xr-x  2 root root 4.0K Feb 15 10:51 2022-02-16/

검색의 정규식

정규식을 사용하여 디렉토리를 찾으려면 다음을 사용할 수 있습니다.

~] find . -type d -regextype posix-extended -regex '\./2022-02-[01][12345890]'
./2022-02-13
./2022-02-09
./2022-02-14
./2022-02-08
./2022-02-11
./2022-02-12
./2022-02-10
./2022-02-15

찾기의 시간 조건

시간 조건 찾기 - 가장 좋은 방법은 사용하는 것입니다.-newerXY

-newerXY reference

Compares the timestamp of the current file with reference.  The reference argument is normally the name of a file (and one of its timestamps is used for the comparison) but it may also be a string describing an absolute time.

X and Y are placeholders for other letters, and these letters select which time belonging to how reference is used for the comparison.

              a   The access time of the file reference
              B   The birth time of the file reference
              c   The inode status change time of reference
              m   The modification time of the file reference
              t   reference is interpreted directly as a time

Some combinations are invalid; for example, it is invalid for X to be t.  Some combinations are not implemented on all systems; for example B is not supported on all systems.  If an invalid or unsupported combination of XY is specified, a fatal error results.  Time specifications are interpreted as for the argument to the -d option of GNU date.  

If you try to use the birth time of a reference file, and the birth  time  cannot  be determined, a fatal error message results.  If you specify a test which refers to the birth time of files being examined, this test will fail for any files where the birth time is unknown.

예:

~] find . -type d -regextype posix-extended -regex '\./2022-02-[01][12345890]' ! -newermt "2022-02-15 10:52:00" -print 
./2022-02-13
./2022-02-09
./2022-02-14
./2022-02-08
./2022-02-11
./2022-02-12
./2022-02-10

디렉토리 삭제

~] find . -type d -regextype posix-extended -regex '\./2022-02-[01][12345890]' ! -newermt "2022-02-15 10:52:00" -exec rm -r {} \;
find: ‘./2022-02-13’: No such file or directory
find: ‘./2022-02-09’: No such file or directory
find: ‘./2022-02-14’: No such file or directory
find: ‘./2022-02-08’: No such file or directory
find: ‘./2022-02-11’: No such file or directory
find: ‘./2022-02-12’: No such file or directory
find: ‘./2022-02-10’: No such file or directory
~] ls -alFh
total 16K
drwxr-xr-x 4 root root 4.0K Feb 15 11:13 ./
drwxr-xr-x 3 root root 4.0K Feb 15 10:51 ../
drwxr-xr-x 2 root root 4.0K Feb 15 11:01 2022-02-15/
drwxr-xr-x 2 root root 4.0K Feb 15 10:51 2022-02-16/

관련 정보