2013-02-04 55 views
0

我有很多文件的路徑,但我需要的所有文件複製到其他位置/sample,我想將文件複製到不同的文件夾:殼創建新的文件夾

/ifshk5/BC_IP/PROJECT/T11073/T11073_RICekkR/Fq/AS34_59329/111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-93_1.fq.gz 
/ifshk5/BC_IP/PROJECT/T11073/T11073_RICekkR/Fq/AS34_59329/111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-93_2.fq.gz 
/ifshk5/BC_IP/PROJECT/T11073/T11073_RICekkR/Fq/AS34_59329/clean_111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-93_1.fq.gz.total.info 

我希望將這些文件複製到裏面/sample

/ifshk5/BC_IP/PROJECT/T11073/T11073_RICekkR/Fq/AS34_59328/111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-93_1.fq.gz 
/ifshk5/BC_IP/PROJECT/T11073/T11073_RICekkR/Fq/AS34_59328/111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-93_2.fq.gz 
/ifshk5/BC_IP/PROJECT/T11073/T11073_RICekkR/Fq/AS34_59328/clean_111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-93_1.fq.gz.total.info 

我希望將這些文件到AS34_59328文件夾複製內部/sample

我寫代碼來SCP的人AS34_59329文件夾l文件到/ sample文件夾,但我不知道如何把每個文件轉換成不同的子目錄,如:

/ifshk5/BC_IP/PROJECT/T11073/T11073_RICekkR/Fq/AS34_59328/clean_111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-93_1.fq.gz.total.info 

投入AS34_59328

#! /bin/bash 
    while read myline 
    do 
    for i in $myline 
     do 
     if [ -f $i]; then 
       #how to put different files into different sub-directory 
       scp -r $i [email protected]:/sample 
     fi 
     done 
    done < data.list 

新變化的部分

 #! /bin/bash 
     while read myline 
     do 
      for i in $myline 
      do 
       if [ -f $i ] 
       then 
       relname=$(echo $i | sed 's%\(/[^/][^/]*\)\{5\}/%%') 
       echo $relname 
       fi 
      done 
     done < /home/jesse/T11073_all_3254.fq.list 
+1

解決方案的哪個部分卡住了?識別要複製的文件?生成新的目錄名稱?製作新目錄?複製文件?如果您向我們展示您到目前爲止所做的工作,那麼我們會幫助您更輕鬆! – Johnsyweb

+0

感謝,製作新目錄,把每個文件放到不同的子目錄 – AntiGMO

+2

換句話說,就是「全部」。 –

回答

1

看來你需要從文件名中去掉路徑名前5個組件。因爲你沒有在你的名稱空間(你使用for i in $myline的方式排除這種可能性),你可以使用:

#! /bin/bash 
while read myline 
do 
    for i in $myline 
    do 
     if [ -f $i ] 
     then 
      relname=$(echo $i | sed 's%\(/[^/][^/]*\)\{5\}/%%') 
      scp -r $i [email protected]:/sample/$relname 
     fi 
    done 
done < data.list 

的正則表達式僅僅是一個尋找的五套斜線的序列方式接着是一個或多個非斜槓加一個斜槓並刪除它們。由於斜線在搜索中突出顯示,我使用%來標記s///操作的部分。

例如,給定輸入:

/a/b/c/d/e/f/g 

sed輸出爲:

f/g 

注意,該代碼不顯式地創建遠程機器上的目錄;它只是指定文件的去向。如果您也需要創建它們,則必須調查ssh,可能在遠程計算機上運行mkdir -p /sample/$(dirname $relname)(dirname操作可以在本地或遠程運行)。

請注意,scp具有遞歸複製模式(-r),如果您知道需要將本地目錄中的所有文件複製到遠程,這將簡化相當大的工作。

+0

謝謝,我回聲relname,但它顯示第6行:[:失蹤']' – AntiGMO

+1

太多copy'n'paste - 我複製你的代碼,並沒有發現,更少修復,它的錯誤! '如果[-f $ i]'需要'$ i'和']'之間的空格,觸發錯誤。 –

+0

改變了它,但它不能顯示任何東西。我已經附上更改的代碼,希望您能看到它。 – AntiGMO