2010-06-30 90 views
0

我写了这段代码来扫描目录中的文件比参考文件更新,同时排除特定的子目录。从shell脚本中的变量运行命令

#!/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”时,它看起来很好,而且如果我用echo命令的输出替换最后一行中的“$ myExcludes”,脚本的行为就像预期的一样。我想这是某种引用/转义错误,但我一直无法消除它。

回答

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 2010-07-01 07:32:06

0

您需要的myExcludes评估,以这样的:

\(-name富/酒吧-o -name富/巴兹-o -name酒吧/巴兹\)