将部分文件夹名称附加到

时间:2015-10-26 06:32:31

标签: bash

我有一个数据文件夹文件夹,其结构如下:

sampleName1-randomNumbers/subfolder1/subfolder2/subfolder3/data1.gz
sampleName1-randomNumbers/subfolder1/subfolder2/subfolder3/data2.gz
sampleName2-randomNumbers/subfolder1/subfolder2/subfolder3/data1.gz

我想通过附加样本名称而不是随机数来修改每个样本文件夹中的所有data.gz:

sampleName1-randomNumbers/subfolder1/subfolder2/subfolder3/sampleName1_data1.gz
sampleName1-randomNumbers/subfolder1/subfolder2/subfolder3/sampleName1_data2.gz
sampleName2-randomNumbers/subfolder1/subfolder2/subfolder3/sampleName2_data1.gz

看起来这应该是一个简单的循环mv,但我还没有能够弄清楚如何使用basename来拉取部分文件夹名称。

for i in */Data/Intensities/BaseCalls/*.gz; do mv $i "fastq""/"${i%%-*}"."`basename $i`; done

我无法弄清楚如何使文件保留在原始文件夹中,但出于我的目的,它可以将所有文件转到新文件夹(" fastq")

1 个答案:

答案 0 :(得分:1)

我想" sampleName"部分不包括短划线。在这种情况下,请使用标准模式删除扩展:%%。也就是说,假设您的完整路径(相对于目录根目录)存储在$path中,只需执行${path%%-*}以提取" sampleName"部分。有关详细信息,请在Bash Reference Manual中搜索%%。举个简单的例子:

> path=sampleName1-randomNumbers/subfolder1/subfolder2/subfolder3/data1.gz
> echo ${path%%-*}
sampleName1

否则,您还可以使用基于正则表达式的更高级子字符串提取。请参阅TLDP Advanced Bash脚本编写指南中的BashFAQ/100Manipulating Strings

<强>更新即可。这是执行所描述的工作的完整命令,它完全是shell原生的:

for file in */Data/Intensities/BaseCalls/*.gz; do
    mv "$file" "${file%/*}/${file%%-*}_${file##*/}"
done