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

我想将这些文件复制到里面的 AS34_59329 文件夹中/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 到 /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
4

1 回答 1

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

于 2013-02-04T06:23:42.407 回答