【问题标题】:Bash script for iterating through defined set of file names and performing commands用于迭代定义的文件名集并执行命令的 Bash 脚本
【发布时间】:2011-03-25 08:23:56
【问题描述】:

我有一组文件夹,例如 10、12、13、14、18、24 等。它们不会以任何标准增量更改数字。然后我需要重复移动到文件夹中,然后进入下一个文件夹以执行除了一些变量扩展名之外相同的 SVN 命令,例如:

/home/boy$ cp /home/files/*Session10.* . ; svn add *Session10.*; svn commit; cd ..; cd 12;

那么下一条命令类似:

/home/boy$ cp /home/files/*Session12.* . ; svn add *Session12.*; svn commit; cd ..; cd 14;

所以应该定义一个数组或列表,然后是一个 for 循环遍历该列表,然后是一个变量,其名称被扩展以输入 cp 和 svn 命令。 有什么想法吗?我希望它可以在命令提示符而不是在 bash 脚本文件中完成。

【问题讨论】:

    标签: svn bash command-line command-line-arguments


    【解决方案1】:

    不费吹灰之力的方法是:

    for dir in [0-9][0-9]/; do
        cd "$dir"
        cp /home/files/*Session${dir%/}.* .
        svn add *Session${dir%/}.*
        svn commit
        cd ..
    done
    

    这将遍历由 2 位数字组成的目录。

    【讨论】:

      【解决方案2】:

      如果列表是预定义的,并且您没有遍历每个存在的目录(换句话说,如果一个名为 99 的目录存在但它不在您想要排除的列表中),您可以遍历列表:

      list="10 12 13 14 18 24"; for dir in $list; do cd "$dir"; do_something "foo $dir bar"; done
      

      或者一个数组:

      array=(10 12 13 14 18 24); for idx in ${!array[@]}; do cd "${array[idx]}"; do_something "foo ${array[idx]} bar"; done
      

      您可以像这样执行上一个或下一个数组元素:${array[idx-1]}${array[idx+1]} 如果您进行适当的检查以确保您没有尝试检索具有负索引的元素(超出最后一个元素的索引将返回一个空值)。

      或:

      array=(10 12 13 14 18 24); for dir in ${array[@]}; do cd "$dir"; do_something "foo $dir bar"; done
      

      这与上面的列表示例基本相同。

      【讨论】:

        【解决方案3】:

        base=$PWD; for num in *; do cd $base/$num; cp /home/files/*Session${num}.* .; svn add *Session${num}.*; svn commit; done

        【讨论】:

        • 什么是残障人士?这是之前某个时候设置的数组吗?在“for num in *”中,asterix 是否自动寻址扩展名集?谢谢
        • @Vass $PWD 是“当前工作目录”。它由 bash 自动设置。第一个* 是匹配文件夹的模式。您可能需要将其替换为更具体的内容,例如 [0-9][0-9][0-9]*[0-9]
        • * 将匹配文件 目录。这就是为什么我使用[0-9][0-9]/ 来全局匹配仅目录。当然,然后你需要删除我在参数扩展中所做的 var 名称中的尾随 `\`。
        【解决方案4】:

        基于查找的解决方案是时候了。

        find . -maxdepth 1 -regextype posix-extended -type d -regex '.*/[0-9]{2}$' -exec \
            bash -c 'dir=${1##*/}
            cd $1 
            cp /home/files/*Session{$dir}.* . 
            svn add *Session${dir}.* 
            svn commit'  -- {} \;
        

        编辑:现在比以往任何时候都更有发现。

        【讨论】:

          猜你喜欢
          • 2023-01-13
          • 2011-09-22
          • 2018-11-15
          • 2016-03-11
          • 1970-01-01
          • 2016-12-27
          • 2017-01-04
          • 2021-11-17
          • 1970-01-01
          相关资源
          最近更新 更多