2015-08-31 3 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/*) 

Он работал отлично на местном уровне, но то я использовал это как код оболочки в рабочий процесс snakemake, а затем он выдает синтаксическую ошибку:

syntax error near unexpected token `(' 

Я предполагаю, что это проблема с интерпретатором bash? Любая подсказка, как еще я мог бы перебирать эти файлы?

Благодаря

Edit: Я также попытался

files=$data$sam/* 

, который выводит

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

У вас есть '#!/Bin/bash' в верхней части вашего скрипта? –

+0

Вам даже не нужна переменная 'files'. Просто используйте: '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; 

должны перебрать все существующие файлы, заменить эхо с вызовом.