【问题标题】:Run command from variables in shell script从 shell 脚本中的变量运行命令
【发布时间】:2010-06-30 15:24:36
【问题描述】:

我编写这段代码是为了扫描目录中比参考文件更新的文件,同时排除特定的子目录。

#!/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 命令的输出,则脚本的行为也符合预期。我猜这是某种引用/转义错误,但我无法消除它。

【问题讨论】:

    标签: linux bash shell find


    【解决方案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 ')')
    

    【讨论】:

    • 非常感谢您的回答。它就像一个魅力,不需要 -prune。
    【解决方案2】:

    你需要 myExcludes 来评估类似这样的东西:

    \( -name foo/bar -o -name foo/baz -o -name bar/baz \)

    【讨论】:

      猜你喜欢
      • 2015-04-19
      • 1970-01-01
      • 2013-11-03
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      相关资源
      最近更新 更多