2015-03-02 111 views
0

我的文件結構的一個簡單的例子是這樣的:慶典 - 在子目錄中,重命名FASTA頭和文件名 - 添加前綴

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

我想編寫一個腳本,我可以通過大會目錄 - 然後它會:

  1. 遍歷每個子目錄(A_velvet,BB_velvet) - 採取應變名(A,BB)將其添加爲前綴(即A_contigs.fasta,A_file.log。)中的所有文件。
  2. 將相同的前綴添加到contigs.fasta文件中的fasta標頭中。 也許使用sed命令替換('s /> NODE /> $ {name}/g')?

我發現很多非常密切相關的問題,但似乎無法使它們工作。很感謝任何形式的幫助!這是我的代碼到目前爲止:

#!/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  
+2

你會得到什麼輸出?你怎麼知道它不工作? – 2015-03-02 22:00:11

+0

@DaleWilson - 輸出只是一個錯誤,第5行:'*':不是有效的標識符。 – tdot 2015-03-02 22:17:58

回答

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 
+0

謝謝你看看我的問題@heathobrien。當我嘗試修改代碼時,什麼都沒有發生。不錯,錯誤消失了,但是壞處是子目錄中沒有文件被重命名。所以嘗試了一些修改,仍然似乎無法得到它。我拿出了if語句(第4行和第9行) - 然後給出以下警告消息:_Assemblies/A_velvet /:name: ls:無法訪問程序集/ A_velvet/::沒有這樣的文件或目錄_ _contigs.fasta name contigs .fasta ls:無法訪問contigs.fasta:沒有這樣的文件或目錄_ – tdot 2015-03-03 19:18:17

+0

我期待實現的輸出是:'Assemblies/A_velvet/A_contigs.fasta' – tdot 2015-03-03 19:22:57

+0

嘗試將$ dir /放在$ subdir的前面,無論它出現在哪裏。您還需要將最後一行更改爲:mv $ dir/$ subdir/$ file $ dir/$ subdir/$ {name} _ $ file – heathobrien 2015-03-04 09:47:39

相關問題