работа с путями в циклах unix

Относительный новичок в unix. У меня есть несколько каталогов (Sample*/), в которых я хочу объединить все файлы raw.sort.bam с помощью samtools. У меня есть рабочий код для этого в каждом каталоге, но я хочу работать со всеми каталогами одновременно, запуская код из родительского каталога. Моя проблема в том, что я вынужден вызывать samtools с полным путем, и мне трудно понять, как этот путь будет работать в цикле unix.

Во-первых, вот мой рабочий код для слияния и преобразования из каждого каталога:

/home/user/pathtosamtools/sam merge -o all.sort.bam *raw.sort.bam

Теперь мой НЕрабочий код пытается сделать это для всех каталогов при запуске из родительского каталога:

for f in `ls Sample*/`; do /home/user/pathtosamtools/sam merge -o $f all.sort.bam Sample*/*raw.sort.bam; done

Ошибки:

[bam_merge_core_ext] fail to open file all.sort.bam
[bam_header_read] bgzf_check_EOF: Invalid argument
[bam_header_read] invalid BAM binary header (this is not a BAM file).
Segmentation fault

Заранее спасибо.


person user6130897    schedule 30.03.2016    source источник


Ответы (1)


Не анализировать ls

for dir in Sample*/; do 
    /home/user/pathtosamtools/sam merge -o "$dir/all.sort.bam" "$dir"/*raw.sort.bam
done

Вы предоставляете шаблон глобуса в цикле for.

В целях безопасности всегда указывайте свои переменные.

person glenn jackman    schedule 31.03.2016
comment
Это работает, тысяча благодарностей! Также благодарю вас за несколько советов по передовому опыту. Осталось многому научиться. - person user6130897; 31.03.2016