文件名中的通配符在bash中不起作用

时间:2018-08-08 14:16:28

标签: bash wildcard git-bash

我知道这里有很多(很多!)类似的问题,但是我找不到能解决我问题的方法。我有以下脚本:

#!/bin/bash

/* MAIN_CLASS and other declarations here */

numOfDatasets=10

for (( i=1; i <= $numOfDatasets; ++i )) do
    DATASET_FILE="C:\path\to\file\name_"$i"_100.fa" 
    QUERY_FILE="C:\path\to\file\name_${i}_100_p"*".fasta"
    mvn exec:java -Dexec.mainClass="${MAIN_CLASS}" -Dexec.args="${DATASET_FILE} ${QUERY_FILE}"
done

但是我得到了错误

  

java.io.FileNotFoundException:C:\ path \ to \ file \ name_1_100_p * .fasta(文件名,目录名或卷标语法不正确)

我想在不同的迭代中分配给QUERY_FILE的字符串的一些示例是name_1_100_p95.fastaname_2_100_p79.fastaname_3_100_p89.fasta等。

之类的命令
echo "name_"*"_100_p"*".fasta"

直接在终端工作。

2 个答案:

答案 0 :(得分:0)

尝试使用内部for循环遍历通配符搜索的结果:

for QUERY_FILE in "C:\path\to\file\name_${i}_100_p"*".fasta"; do
   /* do stuff with $QUERY_FILE */
done

答案 1 :(得分:0)

您正在为QUERY_FILE分配一个字符串值,但我想您希望它是运行命令的结果。
尝试这样的事情:

QUERY_FILE=`ls "C:\path\to\file\name_${i}_100_p"*".fasta" | head -1`

head -1是如果您希望*中匹配第一个文件,则可以对其进行修改以适合您的特定需求。

完整示例:

#!/bin/bash

/* MAIN_CLASS and other declarations here */

numOfDatasets=10

for (( i=1; i <= $numOfDatasets; ++i )) do
    DATASET_FILE="C:\path\to\file\name_"$i"_100.fa" 
    QUERY_FILE=`ls "C:\path\to\file\name_${i}_100_p"*".fasta" | head -1`  
    mvn exec:java -Dexec.mainClass="${MAIN_CLASS}" -Dexec.args="${DATASET_FILE} ${QUERY_FILE}"
done