2016-06-14 85 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