【问题标题】:command line : ignore particular file while using wildcards命令行:使用通配符时忽略特定文件
【发布时间】:2012-08-31 12:07:29
【问题描述】:

假设我在一个名为 test 的文件夹中有很多 shell 脚本。我想执行其中的所有文件,除了一个特定文件。我该怎么办?手动重新定位文件或一个接一个地执行文件不是一种选择。有什么办法可以在单行中做到这一点。或者,向执行所有文件的sh path/to/test/*.sh 添加一些内容?

【问题讨论】:

  • 你的意思是我想包含除一个以外的所有文件吗?

标签: shell command-line terminal


【解决方案1】:
for file in test/*; do
    [ "$file" != "test/do-not-run.sh" ] && sh "$file"
done

如果您使用bash,您可以使用扩展模式来跳过不需要的脚本:

shopt -s extglob
for file in test/!(do-not-run).sh; do
    sh "$file"
done

【讨论】:

    【解决方案2】:
    for FILE in `ls "$YOURPATH"` ; do 
      test "$FILE" != "do-not-run.sh" && sh "$YOURPATH/$FILE"; 
    done
    

    【讨论】:

    • 如果有任何路径包含空格,解析ls 的输出将失败。
    【解决方案3】:

    find path/to/test -name "*.sh" \! -name $pattern_for_unwanted_scripts -exec {} \;

    Find 将递归执行目录中以 .sh (-name "*.sh") 结尾且不匹配不需要的模式 (\!-name $pattern_for_unwanted_scripts) 的所有条目。

    【讨论】:

      【解决方案4】:

      bash 中,只要您执行shopt -s extglob,您就可以使用“扩展通配符”允许使用!(pattern-list),它匹配除给定模式之一之外的任何内容。

      在你的情况下:

      shopt -s extglob
      for f in !(do-not-run.sh); do if [ "${f##*.}" == "sh" ]; then sh $f; fi; done
      

      【讨论】:

      • 这将匹配每个不是“do-not-run.sh”的文件。
      • 或者,只是将扩展名移出否定模式:!(do-not-run).sh 匹配除“do-not-run.sh”之外的所有“*.sh”文件
      猜你喜欢
      • 2022-07-24
      • 2016-04-18
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多