2010-11-30 65 views
2

我有一组文件夹命名为例如10,12,13,14,18,24等等。它们不会更改任何标准增量中的数字。然后我需要重复地移动到文件夹中,然后进入下一个要执行SVN命令,其是除了一些变量扩展相同的,例如:Bash脚本迭代通过定义的文件集名称和执行命令

/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脚本文件中完成。

回答

1

如果列表是预定义的,并且您不遍历每个存在的目录(换句话说,如果存在一个名为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]}如果你做相应的检查,以确保你没有试图检索元素与否定e索引(超出最后一个元素的索引将返回空值)。

或:

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

其基本上与上述相同的列表的例子。

1

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

+0

什么是PWD?这是早些时候设置的阵列吗?并且在“for num in *”中,asterix会自动处理这组扩展名?谢谢 – Vass 2010-11-30 17:08:47

2

的没有道理的方法是:

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

这将在其由2个位数的目录进行迭代。

1

查找式解决方案的时间。

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' -- {} \; 

编辑:现在比以往更寻找。