在循环文件

时间:2017-09-01 10:07:50

标签: arrays bash if-statement

我有一些bash循环脚本循环文件并用它们做一些事情

for pdb in ${output}/*.pdb ; do
name=$(basename "$pdb")
echo "I am sending ${name} to some place!"
done

现在我想在循环中引入一些过滤器来传递文件,而不在$ name的任何部分中使用一些关键字,从而排除所有具有已定义关键字的文件。

为了实现我想在数组中设置所有关键字

#For a file with that keywords within the name the script should stop and loop another file etc
declare -a keywords=('apo' 'Apo' 'APO' 'sauf');

#workflow for a signle keyword "apo"
 for traj in ${all_trr}/*.xtc; do
 traj_name3=${traj##*/[0-9][0-9]_[0-9][0-9]_[0-9][0-9][0-9][0-9].}
 if [[ "$traj_name" != *apo* ]]
 then
#begins loop from the another file
  echo "I am sending ${traj_name} to analysis"
  #break 
 else
  echo "I am not sending ${traj_name} to analysis"
  continue
 fi
done

所以我需要为数组调整这个工作流程:1)比较每个文件名和数组元素3)只有当它与它不匹配时才将它发送到脚本。 例如,我有一个复杂名称的文件,其中关键字出现在不同的部分:

08_29_2017.gromacs_AT1_dry_sauf.1rep.step7_1.pdb
08_29_2017.gromacs_AT1_dry_Apo.1rep.step7_1.pdb
08_29_2017.gromacs_AT1_wat_apo.3rep.step7_1.pdb
08_30_2017.gromacs_AT1_wat_Na.2rep.step7_1.pdb

所以只有

08_30_2017.gromacs_AT1_wat_Na.2rep.step7_1.pdb

应传递给

echo "I am sending ${name} to some place!"

同时如果我的文件只有一个关键字,例如apo

08_29_2017.gromacs_AT1_dry_apo.1rep.step7_1.pdb
08_29_2017.gromacs_AT1_dry_apo.1rep.step7_1.pdb
08_29_2017.gromacs_AT1_wat_apo.3rep.step7_1.pdb
08_30_2017.gromacs_AT1_wat_Na.2rep.step7_1.pdb

也只应处理最后一个文件(但该数组应包含许多10-15个关键字,包括'apo')

1 个答案:

答案 0 :(得分:0)

我现有的代码中有一些我不理解的东西:

  1. 您的模式替换traj_name3=${traj##*/[0-9]...}似乎毫无用处。我错过了什么?我会压制它。
  2. 您指定了一个名为traj_name3的变量,但您稍后使用名为traj_name的变量。错字?
  3. 您显示*.pdb个文件名示例,但您的代码会查找*.xtc。错字?我将假设它是*.pdb
  4. 您没有为文件名提供清晰的模式。如果任何的关键字与文件名中的任何地方相匹配,我将假设您要跳过文件。
  5. 这是固定的,类似下面的内容应该有效:

    declare -a keywords=('apo' 'Apo' 'APO' 'sauf');
    for traj in ${all_trr}/*.pdb; do
        for keyword in "${keywords[@]}"; do
            if [[ "$traj" == *$keyword* ]]; then
                echo "I am not sending $traj to analysis"
                continue 2 # continue outermost loop
            fi
        done
        echo "I am sending $traj to analysis"
    done