Добавить файл с помощью (*) символа звезды в переменную в цикле for

#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