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

すべてのファイルを /sample フォルダーに scp するコードを書きますが、次のように、各ファイルを異なるサブディレクトリに配置する方法がわかりません。

/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

正規表現は、5 セットのスラッシュの後に 1 つ以上の非スラッシュともう 1 つのスラッシュが続くシーケンスを探し、それらを削除する方法です。検索ではスラッシュが目立つため、代わり%に操作のセクションにマークを付けていました。s///

たとえば、次の入力があるとします。

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

からの出力sedは次のとおりです。

f/g

このコードは、リモート マシン上にディレクトリを明示的に作成しないことに注意してください。ファイルの移動先を指定するだけです。それらも作成する必要がある場合は、リモート マシン (ローカルまたはリモートで dirname 操作を実行できる場所) でssh実行するために、おそらく調査する必要があります。mkdir -p /sample/$(dirname $relname)

すべてのファイルをローカル ディレクトリからリモート ディレクトリにコピーする必要があることがわかっている場合scpは、再帰コピー モード ( ) があることに注意してください。-r

于 2013-02-04T06:23:42.407 に答える