2010-06-30 4 views
0

특정 하위 디렉토리를 제외하고 참조 파일보다 새로운 파일을 찾기 위해이 코드를 작성했습니다.쉘 스크립트의 변수에서 명령 실행

#!/bin/bash 

dateMarker="date.marker" 
fileDate=$(date +%Y%m%d) 
excludedDirs=('./foo/bar' './foo/baz' './bar/baz') 
excludedDirsNum=${#excludedDirs[@]} 

for ((i=0; i < $excludedDirsNum; i++)); do 
    myExcludes=${myExcludes}" ! -wholename '"${excludedDirs[${i}]}"*'" 
done 

find ./*/ -type f -newer $dateMarker $myExcludes > ${fileDate}.changed.files 

그러나 제외는 무시됩니다. "echo $ myExcludes"를 실행하면 마지막 줄의 "$ myExcludes"를 echo 명령의 출력으로 바꾸면 스크립트가 정상적으로 작동합니다. 나는 그것이 어떤 종류의 인용/탈출 오류라고 생각하지만, 나는 그것을 제거 할 수 없었다.

답변

1

이 될 것 같습니다 문제를 인용, 배열을 사용해보십시오 :

#!/bin/bash 

dateMarker=date.marker 
fileDate=$(date +%Y%m%d) 
excludedDirs=('./foo/bar' './foo/baz' './bar/baz') 
args=(find ./*/ -type f -newer "$dateMarker") 
for dir in "${excludedDirs[@]}" 
do 
    args+=('!' -wholename "$dir") 
done 
"${args[@]}" > "$fileDate.changed.files" 

어쩌면 당신은 또한 -prune이 필요합니다

args=(find ./*/) 
for dir in "${excludedDirs[@]}" 
do 
    args+=('(' -wholename "$dir" -prune ')' -o) 
done 
args+=('(' -type f -newer "$dateMarker" -print ')') 
+0

답변 주셔서 감사 많이. 그것은 -prune이 필요없는 매력처럼 작동합니다. – raphinesse

0

는이 같은 것으로 평가하기 위해 myExcludes 필요합니다

\ (-name foo는/바 -o -name foo는/바즈 -o -name 바/바즈의 \)

관련 문제