Еще один, на который я не могу найти ответа, и такое ощущение, что я сошел с ума.
У меня есть сценарий BASH, использующий цикл for для выполнения сложной команды (много выравниваний последовательностей белков) для большого количества файлов (~ 5000). Цикл создает операторы, которые будут выполняться, если заданы отдельно (т. Е. Скопированы из сообщения об ошибке в командную строку), но которые возвращают «нет такого файла или каталога» внутри цикла. Скрипт ниже; на самом деле есть еще несколько аргументов, но это включает некоторые типичные аргументы и аргументы файла.

  #! / bin / bash 

# Передать каталог с целями в виде последовательностей FASTA в качестве аргумента. # Аргументы к psiblast # Обычный db = local / db / nr / nr outfile = "/ mnt / scratch / psi-blast" e = 0.001 thread = 8 itnum = 5 pssm = "/ mnt / scratch / psi-blast / pssm. " pssm_txt = "/ mnt / scratch / psi-blast / pssm." псевдо = 0 pwa_inclusion = 0,002

Для i в $ {1} / * do filename = $ (basename $ i) "local / ncbi-blast-2.2.23 + / bin / psiblast \ -query $ {i} \ -db $ db \ -out $ { outfile} / $ {filename} .out \ -evalue $ e \ -num_threads $ themes \ -num_iterations $ itnum \ -out_pssm $ {pssm} $ filename \ -out_ascii_pssm $ {pssm_txt} $ {filename} .txt \ -pseudocount $ псевдо \ -inclusion_ethresh $ pwa_inclusion "выполнено

Выполнение этих сценариев дает " line <последняя строка перед 'done'>: <запрошенная команда>: нет такого файла или каталога. Если я затем вставлю предпринятую команду в приглашение, она запустится.
Выполнение каждой из этих команд занимает несколько минут.

1
reve_etrange 25 Мар 2010 в 13:08

3 ответа

Лучший ответ

Попробуйте без кавычек. и ты забыл некоторые косые черты.

for i in ${1}/*
do
filename=$(basename $i)
local/ncbi-blast-2.2.23+/bin/psiblast \
 -query "${i}" \
 -db "$db" \
 -out "${outfile}/${filename}.out" \
 -evalue "$e" \
 -num_threads "$threads" \
 -num_iterations "$itnum" \
 -out_pssm "${pssm}/$filename" \
 -out_ascii_pssm "${pssm_txt}/${filename}.txt" \
 -pseudocount "$pseudo" \
 -inclusion_ethresh "$pwa_inclusion"
done
2
ghostdog74 25 Мар 2010 в 13:15
Косые черты здесь не должны быть, переменные дают абсолютный путь плюс общий суффикс имени файла.
 – 
reve_etrange
25 Мар 2010 в 13:26

Наблюдаемое вами поведение произойдет, если в именах файлов, которые вы повторяете, есть пробелы. По этой причине вам нужно правильно цитировать имена файлов, как в следующем минимальном примере:

#!/bin/bash
for i in *
do
  filename="$(basename "$i")"
  command="ls -lah '$filename'"
  echo "filename=$filename"
  echo "Command = $command"
  eval "$command"
done
0
RTBarnard 25 Мар 2010 в 13:19
Ни в одном из моих имен файлов нет пробелов. Добавление кавычек в любом случае не помогает.
 – 
reve_etrange
25 Мар 2010 в 13:23

Добавление кавычек к именам файлов не поможет при использовании цикла for. Чтобы преодолеть это, я всегда делал что-то похожее на следующий пример, когда мне нужно было перебирать имена файлов:

ls -1 directory | { while read line; do echo $line; done; }
0
musashiXXX 29 Мар 2010 в 20:04