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
대신 명령을 사용할 수 있습니다 .-exec
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]' | 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/