2016-07-05 3 views
2

특정 스크립트 및 지원 파일을 포함하는 하위 디렉토리가있는 디렉토리가 있습니다. 적절한 파일이 각 디렉토리에 있는지 확인해야합니다. 이 디렉토리는 언제든지 변경 될 수 있습니다, 그래서 나는 떠들썩한 파티를 사용하고 싶습니다 (나는 생각한다) 및 배열에하위 폴더의 내용을 찾고 확인하십시오.

find . -maxdepth 1 -type d -not -name home -not -name lhome -print 

을 적절한 subdirectores를 반환하고 해당 디렉토리의 각 적절한 포함되어 있는지 확인하려면 다음 명령을 저장 파일 : 그것은 특정 디렉토리에 해당 파일을 포함하지 않는 경우

file1 file2 file3.sh file4.conf

, 나는 문제이며 파일이 누락되어있는 어떤 디렉토리를 알아야합니다. 목표를 달성하기위한 최선의 방법은 무엇입니까? 어쩌면 배시가 잘못된 도구 일 수 있고 펄이나 어떤 것이 더 좋을까요?

+0

배쉬는 작동하지만 나는이 경우에 파이썬이나 펄을 사용할 것이다. 콘솔에 결과 만 출력해야합니까? – Martin

답변

2

은보다 통합 된 방법이있을 수 있지만, 여기에서 내 샷이다 :이 find는 현재 디렉토리를 반환

while read -rd '' directory; do 
    files=("file1" "file2" "$directory.sh" "$directory.conf") 
    for file in "${files[@]}"; do 
     if [ ! -e "$directory/$file" ]; then 
      echo "$directory is missing $file" 
     fi 
    done 
done < <(find . -maxdepth 1 -type d -not -name home -not -name lhome -print0) 

참고. 이를 피하려면 -mindepth 1 옵션을 추가하는 것이 좋습니다.

또한 스크립트로 만들려면 대신 .$1으로 바꾸고 대상을보다 유연하게 지정할 수 있습니다.

+0

Nice :) 제 제안은 비표준 디렉토리 이름을 다루기 위해'-print '와 find를 사용하고'-d' ''를'read'와 함께 사용하는 것입니다 – sjsam

+0

만약에 ... 나는 바보입니다. file3.sh와 file4.conf의 디렉토리 이름이 같은지 잊어 버렸습니까? 당신이 그것을 가지고 있기 전에 나는 그 변수를 어떻게 얻을 것인가? –

+0

은 첫 번째 레벨 루프에서 FILES를 정의하고 기존 '$ directory' 변수를 사용합니다. 'FILES = "file1 file2 $ directory.sh $ directory.conf"' – Aaron

0

나는 이런 식으로 뭔가가 작동하지 않을 수 있습니다 생각 :

shopt -s nullglob extglob 
diff <(while IFS= read -r f; do printf "%s\n" "$f/"{file1,file2,file3.sh,file4.conf}; done < <(printf "%s\n" !(home|lhome))) \ 
    <(printf "%s\n" !(home|lhome)/{file1,file2,file3.sh,file4.conf}) 

기본적으로 어떤 일이 일어나고 것은, 가능한 모든 파일의 목록이 while 루프에 의해 생성되는 뭔가처럼 그런 다음 다른

c/file1 
c/file2 
c/file3.sh 
c/file4.conf 
d/file1 
d/file2 
d/file3.sh 
d/file4.conf 

목록은 기존 파일로 생성됩니다.

c/file1 
c/file2 

이제 누락 된 항목은 모두 차이점을 찾기 위해 두 개의 목록을 비교 :

2,5d1 
< c/file2 
< c/file3.sh 
< c/file4.conf 
< d/file1 
7,8d2 
< d/file3.sh 
< d/file4.conf 

을 예상 한 파일 목록이 두 번 기록 하나,이 몇 가지 심각한 단점이 볼 수 있듯이. 그리고 각 목록은 많은 디렉토리가있는 경우 문제를 일으킬 수있는 메모리에 저장됩니다.

관련 문제