crontab 작업의 *가 파일 이름으로 대체되는 이유는 무엇입니까?

crontab 작업의 *가 파일 이름으로 대체되는 이유는 무엇입니까?

내 클린 도커 로그 스크립트는 다음과 같습니다(CentOS 7).

#!/usr/bin/env bash

set -uex

echo "======== start clean docker containers logs ========"  
logs=$(find /var/lib/docker/ -type f -name *.log -size +25M)  
for log in $logs  
  do  
    echo "clean logs : $log"  
    cat /dev/null > $log  
  done  
logsrm=$(find /var/lib/docker/ -mtime +7 -name *.log -type f)  
for logm in $logsrm  
  do  
    echo "delete logs : $logm"  
    cat /dev/null > $logm
  done
echo "======== end clean docker containers logs ========"

crontab을 사용하여 실행할 때:

*/1 * * * * root /data/scripts/docker-clean.sh >> $HOME/cron.log 2>&1

출력 로그는 다음과 같습니다.

[root@uat-k8s-01 ~]# tail -f cron.log
++ find /var/lib/docker/ -type f -name cron.log cront.log -size +25M
find: paths must precede expression: cront.log
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
+ logs=
+ echo '======== start clean docker containers logs ========'
======== start clean docker containers logs ========
++ find /var/lib/docker/ -type f -name cron.log cront.log -size +25M
find: paths must precede expression: cront.log
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
+ logs=

작동하게 하려면 어떻게 해야 합니까?

답변1

내 답변에서 언급했듯이이전 질문*.log, 호출 전에 쉘이 현재 디렉토리의 이름으로 패턴을 확장하지 못하도록 패턴을 인용해야 합니다 find.

그렇지 않으면 반복하지 마세요 find(예: "찾기 결과를 반복하는 것이 왜 나쁜 습관입니까?").

귀하의 경우 루프

logs=$(find /var/lib/docker/ -type f -name *.log -size +25M)  
for log in $logs  
  do  
    echo "clean logs : $log"  
    cat /dev/null > $log  
  done  

다음과 같이 다시 작성할 수 있습니다.

find /var/lib/docker -type f -name '*.log' -size +25M -exec sh -c '
for log
  do
    echo "clean logs : $log"  
    cat /dev/null > "$log"
  done' sh {} +

truncate또는 GNU 유틸리티 가 있는 경우

find /var/lib/docker -type f -name '*.log' -size +25M \
    -exec echo "clean logs: " {} \; -exec truncate --size=0 {} +

또는 GNU를 사용하여 find,

find /var/lib/docker -type f -name '*.log' -size +25M \
    -printf 'clean logs: %p\n' -exec truncate --size=0 {} +

두 번째 루프는 같은 방식으로 다시 작성하거나 결합할 수 있습니다.

find /var/lib/docker -type f -name '*.log' \
    \( \( -size +25M -printf 'clean logs: %p\n'  \) -o \
       \( -mtime +7  -printf 'delete logs: %p\n' \) \) -exec truncate --size=0 {} +

여러분도 구경해 보세요”"find"의 -exec 옵션 이해".

스크립트는 표준 sh구문만 사용하므로 첫 번째 줄을 #!/bin/sh.

답변2

사용된 두 줄을 find변경해야 합니다. 예를 들어 다음과 같습니다.

find /var/lib/docker/ -type f -name *.log -size +25M

질문은 인용되지 않았습니다 *.log. 작은따옴표로 묶으십시오 '*.log'.

그 이유는 인용되지 않은 경우 쉘이 이에 액세스하여 현재 디렉토리의 파일과 일치하도록 확장할 수 있기 때문입니다. 두 개 이상의 로그 파일이 있는 경우 다음과 같은 find오류가 발생하게 됩니다.

find /var/lib/docker/ -type f -name aa.log bb.log cc.log -size +25M

관련 정보