Ошибка: слишком много позиционных аргументов (1) при использовании BLAST с bash для цикла

Я пытаюсь написать сценарий, который будет проходить через все каталоги в каталоге, где он будет запрашивать определенную последовательность в локальной базе данных Blast. Я запустил поиск BLAST без цикла bash for и в первую очередь использовал цикл for для создания баз данных. Я перепробовал все, что предлагали другие, имеющие эту проблему (где это применимо) безрезультатно. Я ничего не копирую и не вставляю, я перепечатал скрипт и искал глупые ошибки (которых я делаю много). Может я просто этого не вижу? В любом случае вот код:

SRV01:~$ for d in ~/data/Shen_transcriptomes/transcriptomes/*/; do tblastn -query ~/data/chitin_binding_protein/cbp_Tectaria_macrodonta.fa -db "$d"*BLASTdb* -out "$(basename "$d")".out; done

Когда я запускаю то же самое с: echo "$d"*BLASTdb*, он возвращает правильные файлы. Таким образом, цикл for работает, но приведенный выше скрипт возвращает:

Error: Too many positional arguments (1), the offending value: /home/dwickell/data/Shen_transcriptomes/transcriptomes/Acrostichum_aureum_RS90/RS_90_BLASTdb.nin

для каждого файла BLASTdb в каталоге.

-редактировать-

Так что это работает, но я не знаю достаточно о bash, чтобы понять почему:

SRV01:~/data$ for d in /home/dwickell/data/Shen_transcriptome/transcriptomes/*/*.nin; do 
    name=$(echo "$d" | cut -f 1 -d '.')
    blastn -query ./chitin_binding_protein/cbp_Tectaria_macrodonta.fa -db "$name" -outfmt 6 -out RS_103_tblastn.out; done

2 ответа

Держу пари, у вас есть каталог с более чем одним совпадающим файлом BLAST. Попробуйте этот тест:

for d in ~/data/Shen_transcriptomes/transcriptomes/*/; do
  echo "For directory $d have:"
  ls -1 "$d"*BLASTdb*
  echo
done

Хорошо, как я уже упоминал в редактировании моего вопроса выше. Кажется, я нашел решение:

for d in /home/dwickell/data/Shen_transcriptomes/transcriptomes/*/*.nin; do 
    name=$(echo "$d" | cut -f 1 -d '.')
    blastn -query ./chitin_binding_protein/cbp_Tectaria_macrodonta.fa -db "$name" -outfmt 6 -out "$(basename "$d" .nin)".out; done

Я не понимаю, почему это работает, но это работает. Возможно, это как-то связано со звездочкой в ​​моей предыдущей попытке? Если кто-то может уточнить, пожалуйста, сделайте! Однако для моих собственных целей я считаю это решенным.

Спасибо всем за комментирование.

Другие вопросы по тегам