我有很多文件的路径,但我需要将所有文件复制到其他位置/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
我想将这些文件复制到/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
答案 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
),如果您知道需要将所有文件从本地目录复制到远程,这将大大简化。