#bash #loops #file #variables
#bash #циклы #файл #переменные
Вопрос:
У меня есть структура папок, в которой в папке находятся два файла. Файлы имеют длинные имена, но различаются R1 и R2. Обратите внимание, что я выполняю это для многих папок, используя цикл for, но для этого примера это просто.Я запускаю цикл и задаюсь вопросом, как правильно вызывать файлы с символом звезды (*) для автозаполнения без необходимости вводить все имя файла. Моя попытка приведена ниже:
#!/bin/bash
for item in Folder_Directory:
do
forward=$item/*R1*
reverse=$item/*R2*
bbmap.sh ref=reference.fna in1=$forward in2=$reverse outu=Unmapped.fasta
done
Вывод, который я получаю, является ошибкой, поскольку переменная не идентифицирует нужный файл:
Ошибка:
align2.BBMap build=1 overwrite=true fastareadlen=500 ref=reference.fna
in1=Folder_Dictory/*R1* in2=Folder_Dictory/*R2* outu=Folder_Dictory/Unmapped.fastq
Однако в этом примере я мог бы автоматически заполнять файлы, когда я расширяю этот цикл, чтобы включить несколько папок, что уже не идеально. Автозаполнение с использованием символов (*) было моим первым подходом, любые другие предложения или исправления моей проблемы приветствуются.
Ответ №1:
Проблема в том, что оболочка видит in1=Folder_Dictory/*R1*
и замечает, что нет файлов, которые соответствуют глобусу с буквальным in1=
префиксом, и поэтому подстановочный знак вообще не расширяется.
Вероятно, вы захотите оценить подстановочный знак перед передачей его команде, например
for item in Folder_Directory:
do
forward=$item/*R1*
reverse=$item/*R2*
bbmap.sh ref=reference.fna in1="$(echo $forward)" in2="$(echo $reverse)" outu=Unmapped.fasta
done
Это, конечно, все равно будет неустойчивым, если подстановочный знак расширяется до нескольких файлов.
Комментарии:
1. Это сделало работу, спасибо! Хороший момент, если есть несколько файлов с этим расширением, к счастью, в данном случае это неприменимо. Я ценю ответ.
Ответ №2:
Если вам нужны только два файла из вашего folder_structure
, то я считаю, что было бы неплохо использовать find
для поиска файлов и присвоения их отдельным переменным в соответствии с вашими требованиями … не вижу for
здесь использования цикла.
forward=$(find Folder_Directory -type f -name "*R1*")
reverse=$(find Folder_Directory -type f -name "*R2*")
bbmap.sh ref=reference.fna in1="$forward" in2="$reverse" outu=Unmapped.fasta
Ответ №3:
Это работает следующим образом:
test=f*
$ echo $test
file
Но
$ echo "$test"
f*
И
test2=$test
$ echo "$test" $test2
f* file
$ echo "$test" "$test2"
f* f*
Чтобы заставить его работать, вы должны сделать что-то вроде этого:
test3="$(echo $test)"
$ echo "$test" "$test2" "$test3"
f* f* file