bash - 在子目录中重命名fasta标头和文件名 - 追加前缀

时间:2015-03-02 21:55:18

标签: bash recursion sed rename bioinformatics

我的文件结构的简化示例是:

/Assemblies/A_velvet/contigs.fasta
/Assemblies/A_velvet/info.log
/Assemblies/BB_velvet/contigs.fasta
/Assemblies/BB_velvet/info.log

我正在尝试编写一个可以传递Assemblies目录的脚本 - 然后它将:

  1. 遍历每个子目录(A_velvet,BB_velvet) - 取应变名称(A,BB)将其作为前缀添加到所有文件中(即A_contigs.fasta,A_file.log)。
  2. 将相同的前缀添加到contigs.fasta文件中的fasta标头中。 也许用sed命令代替(' s /> NODE /> $ {name} / g')?
  3. 我发现了很多非常密切相关的问题,但似乎无法使它们发挥作用。很感谢任何形式的帮助!到目前为止,这是我的代码:

    #!/bin/bash
    #Run with: ./test.sh <assembly_directory>
    #dir= directory with all assemblies inside it
    dir=$1
    for subdir in $dir 
    do
        if [ -d "${subdir}" ]; then
        name=`basename $subdir|cut -d '_' -f 1`;
        echo "${subdir} name ${name}"
             for * in $subdir;
            `do mv "$file" "$subdir/${name}_$(basename "$file")"; done
        fi
    done    
    

1 个答案:

答案 0 :(得分:0)

循环浏览目录内容的方法无法正常工作。在第一种情况下,循环中唯一的项是$ dir。我不确定你在第二种情况下要做的是什么。尝试这样的事情:

dir=$1 
for subdir in `ls $dir` 
do
    if [ -d "${subdir}" ]; then
        name=`basename $subdir|cut -d '_' -f 1`;
        echo "${subdir} name ${name}"
        for file in `ls $subdir`;
        do mv "$file" "$subdir/${name}_$(basename "$file")"; done
    fi
done