2013-02-04 57 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