【问题标题】:Why does my recursive for loop keep repeating the first item in the list?为什么我的递归 for 循环不断重复列表中的第一项?
【发布时间】:2020-12-23 16:38:39
【问题描述】:

我正在使用递归 for 循环,它不断重复列表中第一个目录的命令,而不是移动到下一个目录。这是我的代码:

#!/bin/bash
touch bm4ranks.table
tmp_file=$(mktemp /tmp/file.XXX)
function recursive_for_loop {
for f in *;  do
    if [ -d $f  -a ! -h $f ];
    then
        cd $f;
        cd output.$f;
        touch tmp.$f;
        head -11 $f.bm4ranks | cut -c 22-28 > tmp.$f;
        TMPTOPTEN=$(awk ' { t = $1; $1 = $2; $2 = t; print; } ' tmp.$f | cut -c 1-3,5-7 | paste -s)
        echo $TMPTOPTEN > tmp.$f
        mv tmp.$f ..
        cd ..
        mv tmp.$f ..
        cd ..
        TOPTEN=$(cat tmp.$f)
        echo "$f $TOPTEN" >> bm4ranks.table
        echo Done Transferring Top Ten for $f
        PID="$!"
        echo "$PID:$f" >> $tmp_file
        PID_LIST+="$PID "
        # use recursion to navigate the entire tree
        recursive_for_loop;
        cd ..;
     fi;
done;
};
recursive_for_loop

我有一个文件夹目录,其中每个文件夹都有一个唯一的输出子文件夹。我正在提取前 11 行,剪切一些部分,合并剩下的两个字段,然后将这些值作为一行而不是一列粘贴到一个名为 bm4ranks.table 的文件中。我知道我的命令在我运行它时工作,我在我的 bm4ranks.table 中得到了我想要的输出,但问题是它一遍又一遍地粘贴同一组等级,而不是遍历目录列表并终止.为什么会这样?

【问题讨论】:

标签: bash for-loop recursion


【解决方案1】:

也许我没有抓住你的目标,但你从你首先开始的目录中调用你的函数(两次 cd "into s.th.",两次 cd..)。所以你一遍又一遍地做同样的事情。如果您有带有输出文件夹的嵌套文件夹,递归会很有帮助。

【讨论】:

  • 那么我应该在哪里调用该函数?函数中的什么告诉命令移动到下一个文件夹?
  • 我的第一次尝试是在第二个“cd ..”之前 - 但你必须重新排列一些代码。
【解决方案2】:

仔细查看函数中各个点所在的目录。

  • 你从一些基本目录开始,比如说~
  • cd $f; 行带你进入一个子目录,比如说~/dir1
  • cd output.$f; 线带您进入~/dir1/output.dir1
  • 在各种命令之后,你执行cd ..,所以你回到~/dir1
  • 两行之后是另一个cd ..,所以你又回到了~

所以当你递归回同一个函数时,你就在你开始的同一个目录中。该函数将再次执行for f in *;,结果与上次完全相同,该列表中的第一件事将再次为dir1

您的函数中很可能只是多了一个cd ..。如果您删除其中一个,递归将发生在子目录中,这可能是您正在尝试执行的操作。

【讨论】:

    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多