2015-07-31 2 views
1

У меня есть много каталогов с несколькими файлами, каждая из которых придерживается строгого соглашения об именах. Я попробовал этот цикл:bash for loop: не удалось открыть файл

for s in /home/admin1/phd/results_Sample_*_hg38_hg19/Sample_*_bwa_LongSeed_sorted_hg38.bam; do 
    bedtools genomecov -ibam $s > $s 
done 

но получить для каждого файла:

Failed to open file 

Я просто не могу видеть ошибку

+1

проблема не имеет ничего общего с петлей - http://stackoverflow.com/help/mcve –

ответ

3

Заметьте, что если вы перенаправлять вывод в файл ввода, bash будет обрезать файл перед процесс начинается. Например:

cat file > file 

приведет к пустым файлам. Значение вы будете свободный содержание.

Это потому, что bash откроет все файлы, которые подлежат перенаправлению io до, он запускает команду. Если вы используете >, bash дополнительно обрезает файл до нулевой длины. Я не знаю bedtools, но я предполагаю, что он ожидает непустых файлов в качестве входных данных, поэтому сообщение.


О петле. Обычно не рекомендуется перебирать результаты выражения glob, как вы это делали. Это связано с тем, что имена файлов могут содержать внутренний разделитель полей bash, который приведет к несогласованным результатам.

Я бы предложил использовать вместо find:

find /home/admin1/phd/results_Sample_*_hg38_hg19 \ 
    -maxdepth 1 \ 
    -name 'Sample_*_bwa_LongSeed_sorted_hg38.bam' \ 
    -exec bash -c 'bedtools genomecov -ibam "{}" > "{}.copy"' \; 
+0

как можно указать выходной каталог для файлов .copy ? – Irek

+0

Просто используйте '>" путь/to/{}. Copy " – hek2mgl

Смежные вопросы