【问题标题】:Nested for loop to enter and exit multiple directories Bash script嵌套for循环进入和退出多个目录Bash脚本
【发布时间】:2018-08-27 12:00:10
【问题描述】:

例如,我有 7 个目录,每个目录包含 4 个文件。这 4 个文件遵循以下命名约定 name_S#_L001_R1_001.fastq.gz。 sed 命令是为了部分保留唯一的文件名。

我有一个嵌套的 for 循环,以便进入目录并执行命令,退出目录并继续下一个目录。一切似乎都运行良好,但是代码卡在最后一个目录循环 4 次。

for f in /completepath/*
do
    [ -d $f ] && cd "$f" && echo Entering into $f
    for y in `ls *.fastq.gz | sed 's/_L00[1234]_R1_001.fastq.gz//g' | sort -u`
    do
        echo ${y}
    done
done

示例输出-

Entering into /completepath/m_i_cast_avpv_1
iavpvcast1_S6
Entering into /completepath/m_i_cast_avpv_2
iavpvcast2_S6
Entering into /completepath/m_i_int_avpv_1
iavpvint1_S5
Entering into /completepath/m_i_int_avpv_2
iavpvint2_S5
Entering into /completepath/m_p_cast_avpv_1
pavpvcast1_S8
Entering into /completepathd/m_p_int_avpv_1
pavpvint1_S7
Entering into /completepath/m_p_int_avpv_2
pavpvint2_S7
pavpvint2_S7
pavpvint2_S7
pavpvint2_S7

关于如何正确退出内循环的任何建议?

【问题讨论】:

  • 试过检查 ls *.fastq.gz | sed 's/_L00[1234]_R1_001.fastq.gz//g' | sort -u 真正输出的内容?
  • find /completepath -ls 的输出添加到您的问题中。

标签: bash loops nested


【解决方案1】:

看起来/completepath/ 包含一些不是目录的条目。当/completepath/* 上的循环看到不是目录的东西时,它不会进入它,这要感谢[ -d $f ] 检查。 但它仍然继续运行下一个for y in ... 循环。 此时脚本仍在它所看到的上一个目录中。

解决此问题的一种方法是在 $f 不是目录时跳过循环的其余部分:

if [ -d $f ]; then
    cd "$f" && echo Entering into $f
else
    continue
fi

还有一个更好的方法。通过编写/completepath/*/,只会匹配目录条目,因此您可以将循环简化为:

for f in /completepath/*/
do
    cd "$f" && echo "Entering into $f" || { echo "Error: could not enter into $f"; continue; }
    for y in $(ls *.fastq.gz | sed 's/_L00[1234]_R1_001.fastq.gz//g' | sort -u)
    do
        echo ${y}
    done
done

【讨论】:

  • 优秀。解释非常有用,修改完整路径就可以了。
猜你喜欢
  • 1970-01-01
  • 2019-05-31
  • 2012-03-22
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 2015-10-15
相关资源
最近更新 更多