我编写了这段代码来扫描目录中的文件比参考文件更新,同时排除了特定的子目录。
#!/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
然而,排除被忽略了。当我“回显$ myExcludes”时,它看起来很好,而且如果我用echo命令的输出替换最后一行中的“$ myExcludes”,脚本的行为就像预期的那样。我想这是某种引用/转义错误,但我无法消除它。
答案 0 :(得分: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 ')')
答案 1 :(得分:0)
你需要myExcludes来评估这样的东西:
\(-name foo / bar -o -name foo / baz -o -name bar / baz \)