【问题标题】:Append part of folder name to all .gz within将部分文件夹名称附加到所有 .gz 中
【发布时间】:2015-10-26 06:32:31
【问题描述】:

我有一个包含以下结构的数据文件夹:

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 for 循环,但我无法弄清楚如何使用 basename 提取文件夹名称的一部分。

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

我不知道如何使文件保留在其原始文件夹中,但出于我的目的,将所有文件放入新文件夹(“fastq”)是可行的

【问题讨论】:

    标签: bash


    【解决方案1】:

    我想“sampleName”部分不包括破折号。在这种情况下,请使用标准模式删除扩展:%%。也就是说,假设您的完整路径(相对于目录根目录)存储在$path 中,只需执行${path%%-*} 即可提取“sampleName”部分。在Bash Reference Manual 中搜索%% 了解更多详情。举个简单的例子:

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

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

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

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

    【讨论】:

    • 感谢您让我走上了正确的道路。我已经用 for 循环编辑了我的问题,可以满足我的需要
    • “我无法弄清楚如何使文件保留在原始文件夹中”是什么意思?是什么阻止你做$(dirname "$i")?另外,你的问题解决了吗?如果是,您可以接受答案。
    • 我没有尝试 dirname,我正在尝试使用 % 或 # 的 ${path } 的不同配置
    • 好。我给你指出了dirname,因为你已经在使用basename,对于不熟悉参数扩展的人来说更容易理解。但是既然你要求它,请注意使用参数扩展而不是 dirnamebasename 性能更高,因为它是 shell 原生的并且不需要分叉,这是 shell 中最昂贵的操作之一脚本。我已经更新了我的答案,向您展示如何完全在本地完成这项工作。
    • 啊!感谢您提供完整的示例,我不理解 %% 和 % 或 ## 和 # 之间的区别
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    相关资源
    最近更新 更多