Найти цикл с переменным именем файла и пути

avatar
Madza Farias-Virgens
8 апреля 2018 в 00:31
67
1
1

Я пытаюсь выполнить цикл bash, чтобы запустить простой процесс для всех файлов с расширением .sam, которые можно найти в каталоге и его подкаталогах, и использовать то же имя (расширение exc) для вывода, что и для ввода. , при этом выходные данные направляются в ту же папку, в которой были найдены входные данные.

Я получил следующее:

for file in $(find ~/data/finch_data/combruns_BF_genomes -name "*.sam" -type f); do 
    name="${file%.sam}"
    dir=$(pwd $file)
    samtools view -Sb "$dir"/"$name".sam > "$dir"/"$name".bam
done

но я получаю это сообщение:

...
>bash:/home/madzays/qsub//home/madzays/data/finch_data/combruns_ZF_transcriptomes/ZBND81X_gff/filteredfirstZBND81X_gff.bam: No such file or directory
>bash:/home/madzays/qsub//home/madzays/data/finch_data/combruns_ZF_transcriptomes/ZBND81X_gff/filteredsecZBND81X_gff.bam: No such file or directory
>bash:/home/madzays/qsub//home/madzays/data/finch_data/combruns_ZF_transcriptomes/ZBND82V_gff/filteredfirstZBND82V_gff.bam: No such file or directory
...

Что может быть не так? спасибо

Источник
Pedro Lobito
8 апреля 2018 в 01:22
1

Проверьте путь, он дважды включает /home/madzays/, что должно быть неверным.

kyodev
8 апреля 2018 в 01:45
0

dir=$(pwd) not dir=$(pwd $file), но здесь проблема не в этом

kyodev
8 апреля 2018 в 01:47
1

Я предлагаю: samtools view -Sb "$name.sam" > ... (без $dir)

Madza Farias-Virgens
8 апреля 2018 в 20:44
0

Да, это сработало. Но почему? Я думал, что find возвращает только имя файла, а он возвращает весь путь, вплоть до имени файла!

Ответы (1)

avatar
LMC
8 апреля 2018 в 01:14
1

Мне кажется, что nameпеременная не содержит того, что вы хотите. Попробуйте получить имя с basename вместо

for file in $(find ~/data/finch_data/combruns_BF_genomes -name "*.sam" -type f); do name="$(basename $file .sam)" dir=$(pwd $file); samtools view -Sb "$dir"/"$name".sam > "$dir"/"$name".bam; done

Madza Farias-Virgens
8 апреля 2018 в 20:46
0

Да. В переменную name уже включен весь путь, вплоть до имени файла.