使用bash循环遍历文件列表 - 语法错误

时间:2015-08-31 14:40:14

标签: bash shell syntax snakemake

我一直试图循环通过文件列表并根据它们的编号对它们应用操作。我首先尝试使用ls命令,但输出不是列表:

data="data2/Scerevisiae-Pho4/"
results="results3/"
samples=( "GSM730517" "GSM730528" )

if [ ! -d $results ]
then
    mkdir $results
fi
for sam in ${samples[@]}
do
    if [ ! -d $results$sam ]
    then
        mkdir $results$sam
    fi
    echo -e "Reading $sam directory $data$sam... \n"
    files=$(ls $data$sam)
    echo ${files[0]}
done

输出

echo ${files[@]}
    SRR217304.sra SRR217305.sra
echo ${files[0]}
    SRR217304.sra SRR217305.sra

我尝试了这种不同的语法:

files=($data$sam/*)

它在本地运行良好,但后来我将其用作snakemake工作流的shell代码,然后抛出语法错误:

syntax error near unexpected token `('

我猜这是bash解释器的问题?有什么线索我可以循环这些文件吗?

由于

编辑: 我也试过了

 files=$data$sam/* 

输出

echo ${files[0]}
data2/Scerevisiae-Pho4/GSM730517/*

1 个答案:

答案 0 :(得分:1)

您不需要所有这些检查。如果目录路径尚未存在,则可以使用mkdir -p创建目录路径。此外,您根本不需要使用数组

for d in GSM730517 GSM730528;
do p=results3/$d; 
  mkdir -p $p;
  for f in $p/*; 
  do echo $f; 
  done;
done;

应遍历所有现有文件,将echo替换为您的呼叫。