2017-01-26 1 views
2

var/log 디렉토리를 체크인하는 스크립트를 작성하고 거기에있는 모든 디렉토리를 가져 와서 해당 디렉토리에 아카이브 디렉토리가 있는지 확인합니다. 보관 디렉토리가 존재하지 않는다면 생성하고 싶지만 스크립트가 생성되면 스크립트는 다시 생성하려고 시도합니다.디렉토리가 존재하지 않는지 확인하십시오.

vdir=$(sudo sh -c "find /var/log/ -maxdepth 1 -type d ! -name "archive"") 
for i in $vdir ;do 
    echo $i 
    if [[ ! -d $i/$arc ]];then 
     sudo sh -c "mkdir $i/$arc" 
     echo "$date:$HN:Creating:$i/$arc:directory" >> logrotation.log 
    fi 
done 

위의 코드를 실행하면이 오류가 표시됩니다. 스크립트가 조건을 검사하지 않는 것 같습니다.

mkdir: cannot create directory ‘/var/log/speech-dispatcher/archive’: File exists 
+0

'$의 arc'는 무엇을 포함 하는가? – Inian

+0

아카이브 디렉토리를 생성하는 데 필요한 varibale은 다음과 같습니다. arc = archive – SLS

+0

첫 번째'sudo sh -c "찾기에서 큰 따옴표를 중첩 할 수 없습니다 ..." – tripleee

답변

4

두 개의 [ 기호가있는 것이 문제입니다. 하나만이 필요합니다

  if [ ! -d $i/$arc ];then 

추가 포인트 : 일부 쉘 버전이 바로 옆에 닫기 괄호로되는 ;을 처리하지 않습니다.

  if [ ! -d $i/$arc ] ; then 

편집 : 따라서, 나는 최고의 호환성을 위해 다음과 같은 형식을 제안하려는 위에서 도움이되지 않았기 때문에, 더 생각 :

그것은 또한 당신의 스크립트로 실행하는 것이 완전히 가능 실제로 $i 디렉토리의 내용을 읽을 수 없으므로 테스트가 항상 실패합니다 (또는 실제로 성공합니다). 그러나 sudo를 통해 루트 디렉토리를 만들면 이미 존재합니다.

[또한 단지 특정 부분보다는 sudo는 아래 전체 스크립트를 실행하는 것이 더 효율적이 될 것입니다.]

+0

도움을 주셔서 감사합니다.이 변경 작업을 수행했습니다. 아무 일도 일어나지 않습니다. 여전히 디렉토리를 만들려고 할 때 거기에 있지만, 일부 디렉토리에서는 작동합니다. 그 이유가 확실하지 않습니다. – SLS

+1

응? ''''''전통적''을 대신해 배쉬가 새롭게 바뀌었다. 그것은 오랫동안 잘 작동합니다 (쉘이 실제로 Bash 임에!) OP에서 설명한 오류 메시지가 생성되지 않습니다. – tripleee

관련 문제