2017-12-03 6 views
3

명령 줄과 bash 스크립트에서 동일한 명령을 실행하면 Ubuntu 16.04에서 다른 결과가 나타납니다.스크립트에서 호출 할 때 Bash find가 일치하는 모든 파일을 반환하지 못함

├── audio 
│   └── delete_me.mp3 
├── words 
│   └── audio 
│    └── delete_me.mp3 
│   └── images 
│    └── delete_me.jpg 
└── keep_me.txt 

내가 bash는 스크립트가 findKeepers.sh 이름이 :

#!/usr/bin/env bash 

findKeepers() { 
    local dir=$1 
    echo "$(find $dir -type f ! -name delete_me*)" 
} 

findKeepers /path/to/directory 

I 출력에 keep_me.txt 파일의 경로를 그것을 기대

나는 다음과 같은 내용의 폴더가 있습니다. 대신 빈 줄이 생깁니다. 내가 명령 줄에서 동일한 명령으로 나에게 보이는 실행하면

  

, 내가 기대하는 것을 얻을 : 대신 모든 파일에 대해 검색이 keep_me

dir=/path/to/directory; echo "$(find $dir -type f ! -name delete_me*)" 
/path/to/directory/keep_me.txt 

를 호출되지 않으면, bash 스크립트는 오디오 폴더를 무시합니다. 여기에 또 다른 bash는 스크립트가 findUnwanted.sh라고 : 여기

#!/usr/bin/env bash 

findUnwanted() { 
    local dir=$1 
    echo "$(find $dir -type f ! -name keep_me*)" 
} 

findUnwanted /path/to/directory 

은 결과입니다 :

$ ./findUnwanted.sh 
/path/to/directory/words/audio/delete_me.mp3  
/path/to/directory/words/images/delete_me.jpg 

내가 명령 줄에서 같은 일을 실행하면, 나는 세 가지 delete_me 파일 수 :

$ dir=/path/to/directory; echo "$(find $dir -type f ! -name keep_me*)" 
/path/to/directory/words/audio/delete_me.mp3  
/path/to/directory/words/images/delete_me.jpg 
/path/to/directory/audio/delete_me.mp3  

을 bash 스크립트가 words 폴더로 들어가서 시작한 다음 인접한 폴더 나 파일을 검색하기 위해 다시 나오지 않습니다. 이 작업을 수행하는 데있어 #!/usr/bin/env bash 환경에 특별한 것이 있습니까? 아니면 내가보기 싫은 다른 점이 있습니까?


CODA : 더 많은 수정 작업을 거쳐 다시 작업하기 때문에 파일럿 오류라고 생각합니다. 관심있는 사람은 내 기능의 최종 버전을 아래에 표시합니다.

#!/usr/bin/env bash 

# Returns 1 if the given directory contains only placeholder files, or 
# 0 if the directory contains something worth keeping 
checkForDeletion() { 
    local _dir=$1 
    local _temp=$(find "$_dir" -type f ! -regex '.*\(unused.txt\|delete_me.*\)') 

    if [ -z "$_temp" ] 
    then 
    return 1 
    fi 
} 

나는 이런 식으로 그것을 사용 :

parent=/path/to/parent/ 
for dir in $parent*/ 
do 
    checkForDeletion $dir 
    if [ $? = 1 ] 
    then 
    echo "DELETE? $dir" # rm -rf $dir 
    fi 
done 
+2

코드가 제대로 작동합니다. – PesaThe

+5

필자는 재현 할 수 없지만 함수를 작성하는 올바른 방법은 매개 변수 확장과 패턴 인수를 인용하고'find '의 출력을 캡처하지 않는 것입니다 : findKeepers() {local dir = $ 1; "$ dir"-type f를 찾으십시오! -name 'delete_me *'; }' – chepner

+1

대화 형 및 비대화 형 쉘에서 서로 다른'nullglob' 설정이있을 수 있습니다. 이것은 글로브가 어떤 것과도 매치하지 않을 때 행동을 알리는 셸 옵션입니다 (이것은'-name'에 인수를 인용하지 않기 때문에 처음에는 문제입니다).이를 확인하려면 명령 줄에서'shopt nullglob'을 실행하고 스크립트에 넣으십시오. –

답변

0

나는 당신의 추측하고 '!' 전체 파이프를 부수고있다. 대신 '-not'를 사용하십시오, 그래서 첫 번째 코드는 다음과 같다 :

echo "$(find $dir -type f -not -name delete_me*)" 

난 당신이 특수 문자를 탈출 어디 안 어디에 설명에 좋은 아니지만, 사실은 일이 다른 경우 작동하는지 외부 함수를 사용하면 이스케이프 처리가 문제가 될 수 있습니다.

관련 문제