2016-06-28 2 views
0

주어진 위치에 특정 파일이 있는지 여부를 확인하기 위해이 스크립트를 만들었습니다. 하지만 난 실행할 때이 그 항상 실패했습니다 파일 모니터링 Bash 스크립트

을 보여주는 - Flag_lms_device_info_20160628.txt이 존재하지 않는
실패 - Flag_lms_weekly_usage_info_20160628가

존재하지 않지만 두 파일이 존재합니다.

PREFIX="/opt/data" 
REPORT="/tmp/report.txt" 
DATE=$(date -d "${dtd} -1 days" +'%Y%m%d') 

    rm -f "$REPORT" 

       FILENAME="Flag_lms_device_info_${DATE}.txt" 
       FULLFN="$PREFIX/$FILENAME" 
       if [ -f "$FULLFN" ]; then 
         echo "OK - $FILENAME exists" >> $REPORT 
       else 
         echo "Failed - $FILENAME do not exist" >> $REPORT 
       fi 

       FILENAME="Flag_lms_weekly_usage_info_${DATE}.txt" 
       FULLFN="$PREFIX/$FILENAME" 
       if [ -f "$FULLFN" ]; then 
         echo "OK - $FILENAME exists" >> $REPORT 
       else 
         echo "Failed - $FILENAME do not exist" >> $REPORT 
       fi 
다음
+0

를 AS를 제외하고, 변수 이름은 POSIX에 의해 정의 된 네임 스페이스에있는 모든 대문자 쉘 또는 운영 체제에 의미가있는 변수를 사용하십시오 - 사용자 제공 변수 이름에는 충돌을 피하기 위해 최소한 하나의 소문자가 있어야합니다. 환경 변수와 셸 변수가 네임 스페이스를 공유한다는 것을 명심하십시오. (즉, 셸을 명시 적으로 명령하지 않아도 환경 변수와 셸 변수가 네임 스페이스를 공유한다는 것을 명심하십시오) http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html, 4 단락을 참조하십시오. 'export'하면 환경 변수와 겹치는 이름을 가진 쉘 변수를 설정하면 쉘 변수를 덮어 씁니다). –

답변

1

우선, 질문에 이상한 결과가 나타납니다. 출력물의 두 번째 줄에는 .txt 확장자가 없습니다. 이것은 사고일지도 모르지만 그렇지 않은 경우 조사 할만한 가치가 있습니다.

날짜 명령이 올바르게 작동한다고 가정하면 (특정 명령을 모르지만) 변수 사용이 줄어 듭니다. 또한 -e 대신에 -e 테스트 연산자를 사용합니다. 왜냐하면 더 포괄적이기 때문입니다. (아직 파일에 데이터를 입력하지 않은 경우, -f 파일이있는 경우에도 오류를 반환 할 수있다.) :

REPORT="/tmp/report.txt" 
DATE=$(date -d "${dtd} -1 days" +'%Y%m%d') 

echo "" > "$REPORT" # Wipes file instead of completely removing it 

      filename="/opt/data/Flag_lms_device_info_$DATE.txt"     
      if [ -e "$filename" ]; then 

        echo "OK - Flag_lms_device_info_$DATE.txt exists" >> $REPORT 
      else 
        echo "Failed - Flag_lms_device_info_$DATE.txt doesn't exist" >> $REPORT 
      fi 


      filename="/opt/data/Flag_lms_weekly_usage_info_$DATE.txt" 
      if [ -e "$filename" ]; then 

        echo "OK - Flag_lms_weekly_usage_info_$DATE.txt exists" >> $REPORT 
      else 
        echo "Failed - Flag_lms_weekly_usage_info_$DATE.txt doesn't exist" >> $REPORT 
      fi 
+0

Thome에게 감사드립니다 ...... 나는 당신의 코드로 시도했지만 .. 여전히 같은 문제 – lfreez

1
if [ -f "find "$FULLFN" -type f -name "$FILENAME"" ];then 

당신이 역 인용 부호 bash에서

if [ -f `find "$FULLFN" -type f -name "$FILENAME"` ];then 

또는를 사용하여 ... find라는 이상한 파일의 실존을 확인,

if [ -f $(find "$FULLFN" -type f -name "$FILENAME") ];then 

명령의 출력을 얻을 수 문자열로.

또한 find 호출이 유망하지 않습니다. 이라는 파일을 /opt/data/ 아래로 찾으려면 find "$PREFIX" -type f -name "$FILENAME"을 사용하십시오. 당신이 /opt/data 정확한 위치에 있는지 알고 있다면,

if [ -f "$FULLFN" ] 

를 사용하면 find 파일에 필요하지 않습니다.

+0

OP가 질문을 편집하여이 답변의 코드를 삭제 했습니까? BTW,'$ (...)은 배시주의가 아닙니다. 1992 년에 발표 된 POSIX sh 표준에 명시되어 있습니다. 따라서 백틱은 1970 년대 Bourne의 껍데기 파생물에서만 필요합니다. AFAIK는 지난 수십 년 간 발표 된 운영체제에 POSIX 이전 쉘을 포함 할 수있는 유일한 업체이며, 심지어 Sun도 그 셈에 따라 행동을 정리했습니다. –

+0

예, 원래 질문은 조건으로 큰 따옴표 안에'find' 명령을 특색으로 삼았습니다. backticks에 대한 메모를 보내 주셔서 감사합니다. 아마도 bash 매뉴얼의이 섹션을 고대의 솔라리스와 같은 빈티지 버전이라고 읽었을 것입니다. > _ < – bipll

+0

* nod *, 맞아. Sun은 원래 Bourne 쉘을'/ bin/sh '로 설치하고 POSIX sh 인스턴스를'/ usr/xpg4/bin' 또는 somesuch에 넣는 것 중에서 가장 길다. . 재미있는, 재미. –

관련 문제