Удобный скрипт для запуска программы для всех файлов в каталоге один за другим - PullRequest
1 голос
/ 29 октября 2019

У меня 61 файл .fastq, я хочу запустить приложение для каждого из них в отдельности, в результате чего получается 61 выходной файл, так как написать сценарий, избегая вывода списка всех 61 файла? Я попробовал пару простых скриптов, так как я не профессионал, но при запуске программе не удается открыть файлы fastq, однако, когда я запускаю программу только для одного файла, нет проблем с его открытием. Как вы думаете, технически говоря, приведенный ниже сценарий является правильным и должен работать? или я что-то упустил?

samples="$(ls data)"
echo ${samples} | tr " " "\n" | while read sample; do
    gsnap -D ./cinxia  ./data/${sample}.fastq ; done

ИЛИ

for sample in /data/*.fastq; do
    gsnap -D ./cinxia  ./data/${sample}.fastq ; done

Я ожидаю, что программа gsnap запускается для каждого из моих файлов 61 fastq и выдает мне результат каждый раз с одним и тем же файломимя

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

Второе лучше, это плохая форма, чтобы прослушать вывод ls. Я думаю, что если у вас есть определенные символы в именах файлов, у вас могут возникнуть проблемы, но если вы знаете, что имена входных файлов «нормальные», вы можете обойтись, просто используя кавычки, например:

for sample in /data/*.fastq; do
    gsnap -D ./cinxia "./data/${sample}.fastq"
done

Кавычки сделают так, например, если в имени вашего файла есть пробелы:

gsnap -D ./cinxia "./data/file name with spaces.fastq"

Вы можете видеть, что без кавычек командная строка будет видеть, что это много слов, а не однофайл. Будьте осторожны при цитировании и расширении в bash, это сбивает с толку! В некоторых ситуациях вы получаете плохие результаты даже при использовании кавычек.

Что бы произошло, если бы у вас был файл с именем badfile; rm -rf /?

0 голосов
/ 30 октября 2019

Несмотря на то, что ответ Иззи является правильным и простым, если вы ищете повышение производительности (в ожидании проверки правильности и сравнительного анализа), вы можете рассмотреть следующий подход:

find data -name *.fastq -type f -maxdepth 1 -print0 2>/dev/null \
  | xargs -0 -n1 -I{} -P"$(nproc)" gsnap -D ./cinxia "{}"

xargs -P<num> можетпомогите распараллелить gsnap вызов до <num> уровней, где nproc сообщает ему количество процессорных единиц, доступных текущему процессу (которое может быть меньше, чем количество онлайн-процессоров).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...