shell创建新文件夹

时间:2013-02-04 05:35:04

标签: bash shell

我有很多文件的路径,但我需要将所有文件复制到其他位置/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

内的AS34_59329文件夹中
/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

我想将这些文件复制到/sample

内的AS34_59328文件夹中

我将代码写入scp所有文件到/ 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 xxx@191.168.174.43:/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 个答案:

答案 0 :(得分: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 xxx@191.168.174.43:/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),如果您知道需要将所有文件从本地目录复制到远程,这将大大简化。