首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的递归for循环总是重复列表中的第一项?

为什么我的递归for循环总是重复列表中的第一项?
EN

Stack Overflow用户
提问于 2020-12-24 00:38:39
回答 2查看 92关注 0票数 0

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

代码语言:javascript
复制
#!/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中得到我想要的输出,但问题是它一遍又一遍地粘贴同一组排名,而不是遍历目录列表并终止。它为什么要这样做?

EN

回答 2

Stack Overflow用户

发布于 2020-12-24 00:55:59

也许我没有抓住你的目标,但是你从你开始的目录调用你的函数(两次cd "into s.th.",两次cd..)。所以你一遍又一遍地做同样的事情。如果您有包含输出文件夹的嵌套文件夹,则递归将非常有用。

票数 0
EN

Stack Overflow用户

发布于 2020-12-24 03:03:11

请仔细查看函数中各个点上的目录。

假设你从一个基本目录开始,假设~

  • the行将你带入一个子目录,假设~/dir1

  • the
  • 将你带到一个子目录,假设~/dir1
  • the
  • cd $f;将你带入各种命令,你执行cd ..,这样你又回到了~/dir1
  • two行,之后是另一个命令,所以你回到了~

因此,当您递归到同一函数时,您将处于开始时所在的同一目录中。该函数将再次执行for f in *;,结果与上一次完全相同,列表中的第一项将再次是dir1

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65427763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档