2015-08-31 24 views
0

我一直試圖循環低谷列表文件並根據它們的編號對它們進行操作。我第一次使用ls命令試過,但輸出是不是列表:使用bash循環瀏覽文件列表 - 語法錯誤

data="data2/Scerevisiae-Pho4/" 
results="results3/" 
samples=("GSM730517" "GSM730528") 

if [ ! -d $results ] 
then 
    mkdir $results 
fi 
for sam in ${samples[@]} 
do 
    if [ ! -d $results$sam ] 
    then 
     mkdir $results$sam 
    fi 
    echo -e "Reading $sam directory $data$sam... \n" 
    files=$(ls $data$sam) 
    echo ${files[0]} 
done 

輸出

echo ${files[@]} 
    SRR217304.sra SRR217305.sra 
echo ${files[0]} 
    SRR217304.sra SRR217305.sra 

我想這個不同的語法:

files=($data$sam/*) 

它好工作在本地,但然後我將這個shell代碼用於snakemake工作流程,然後引發語法錯誤:

syntax error near unexpected token `(' 

我猜這是一個問題與bash解釋器?任何線索我怎麼能通過這些文件循環?

感謝

編輯: 我也試過

files=$data$sam/* 

其輸出

echo ${files[0]} 
data2/Scerevisiae-Pho4/GSM730517/* 
+1

你在腳本的頂部是否有'#!/ bin/bash'? –

+0

你甚至不需要'文件'變量。只需使用'echo'$ data $ sam「/ *' – anubhava

+0

我需要一個變量,因爲我需要對每個目錄中的文件進行計數,然後循環併合並它們(如果有多個)。 – rioualen

回答

1

你並不需要所有的這些檢查。如果目錄路徑不存在,則可以使用mkdir -p創建目錄路徑。你也不必使用數組在所有

for d in GSM730517 GSM730528; 
do p=results3/$d; 
    mkdir -p $p; 
    for f in $p/*; 
    do echo $f; 
    done; 
done; 

應該遍歷所有現有文件,請使用您調用替換回聲。