Bash 将文件按(*)星型字符添加到for循环中的变量
我有一个文件夹结构,其中两个文件位于一个文件夹中。这些文件的名称很长,但由R1和R2区分注意,我使用for循环在多个文件夹上运行此操作,但在本例中保持简单。我正在运行循环,我想知道如何正确调用带有(*)星号的文件以自动完成,而不必键入所有文件名。我的尝试如下:Bash 将文件按(*)星型字符添加到for循环中的变量,bash,loops,file,variables,Bash,Loops,File,Variables,我有一个文件夹结构,其中两个文件位于一个文件夹中。这些文件的名称很长,但由R1和R2区分注意,我使用for循环在多个文件夹上运行此操作,但在本例中保持简单。我正在运行循环,我想知道如何正确调用带有(*)星号的文件以自动完成,而不必键入所有文件名。我的尝试如下: #!/bin/bash for item in Folder_Directory: do forward=$item/*R1* reverse=$item/*R2* bbmap.sh ref=reference.fna in1=$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
但是,在本例中,当我扩展此循环以包含多个不再理想的文件夹时,我可以自动完成文件。使用(*)字符自动完成是我的第一种方法,非常感谢您对我的问题提出的任何其他建议或解决方案。如果您只需要
文件夹结构中的两个文件
,然后我认为最好使用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
它的工作原理如下:
test=f*
$ echo $test
file
test3="$(echo $test)"
$ echo "$test" "$test2" "$test3"
f* f* file
但是
及
要使其工作,您必须执行以下操作:
test=f*
$ echo $test
file
test3="$(echo $test)"
$ echo "$test" "$test2" "$test3"
f* f* file
问题是shell在1=Folder\u Dictory/*R1*中看到
in1=
前缀,并注意到没有与glob匹配的文件,因此通配符根本不会展开
您可能希望在将通配符传递给命令之前对其求值,例如
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
如果通配符扩展到多个文件,这当然仍然是不稳定的。这样做了,谢谢!关于是否有多个文件具有该扩展名,这一点很好,谢天谢地,在本例中这是不适用的。我感谢你的答复。