2016-06-14 86 views
3

我有以下内容的目录:猛砸基于文件复制到sudirectories匹配的变量

/B7_001 

/B7_002 

B7_001_name.mat 

B7_002_name.mat 

这个目录下的每个子目录的结构如下:

/B7_001/results_activity/sham/task/ 
/B7_002/results_activity/sham/task/ 

我想复制或将每个文件移动到与其名称的第一部分相匹配的子目录的子目录树中。

例如将文件 “B7_001_name.mat”复制到/ B7_001/results_activity/sham/task /中。

我还没有取得太多的成功与下面的代码,所以任何提示将不胜感激。谢谢!

for i in B7_* 
do 
cp ${i}_name.mat /${i}/results_activity/sham/task/ 
done 
+0

你在B7尝试'因为我_ * /'?将仅使用目录名称,但是无论如何,您的代码应该已经工作,只是为匹配的B7_001_name.mat文件添加额外的错误,您只需要在目录上匹配... ?? .. –

+0

谢谢,我做了一个代码的迭代最终将文件复制到/ B7_001而不是/ B7_001/results_activity/sham/task,我找不到原因。现在我明白为什么这些错误正在被抛出,似乎很明显,opps! – avari

+0

argl,我的不好,“B7_001 /”_ name.mat也不好,'d必须去掉/ - 'cp $ {i/\ //} _ name.mat ..' –

回答

4

试着去了解以下内容:

shopt -s nullglob # play it safe when using globs 

for i in B7_*_name.mat; do 
    echo "i=$i" 
    d=${i%_name.mat} 
    echo "d=$d" 
    echo mv "$i" "/$d/results_activity/sham/task" 
done 

运行方式是,它无害,不会执行任何操作;只打印一些东西到您的终端。

  • for i in B7_*_name.mat:这是一个for循环,其中变量i将陆续采取配套的水珠B7_*_name.mat文件名。
  • 与此变量,我们删除使用壳参数扩展的_name.mat部分:

    d=${i%_name.mat} 
    

    这意味着d是其中尾随(因为%_name.mat除去扩张$i

+0

感谢您的明确的扩展。这就说得通了! – avari

+0

对于任何使用该代码的人,不要忘记指定源代码。 mv $ i ./$d/results_activity/sham/task – avari

1

如何使用像下面find - while组合:

find . -type f -print0 | while read -r -d '' line 
do 
    if [[ "$line" =~ ^\./B7_001 ]] 
    then 
    cp "$line" B7_001/results_activity/sham/task/ 
    elif [[ "$line" =~ ^\./B7_002 ]] 
    then 
    cp "$line" B7_002/results_activity/sham/task/ 
    fi 
done