我使用了一个递归的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中得到我想要的输出,但问题是它一遍又一遍地粘贴同一组排名,而不是遍历目录列表并终止。它为什么要这样做?
发布于 2020-12-24 00:55:59
也许我没有抓住你的目标,但是你从你开始的目录调用你的函数(两次cd "into s.th.",两次cd..)。所以你一遍又一遍地做同样的事情。如果您有包含输出文件夹的嵌套文件夹,则递归将非常有用。
发布于 2020-12-24 03:03:11
请仔细查看函数中各个点上的目录。
假设你从一个基本目录开始,假设~
~/dir1
~/dir1cd $f;将你带入各种命令,你执行cd ..,这样你又回到了~/dir1~因此,当您递归到同一函数时,您将处于开始时所在的同一目录中。该函数将再次执行for f in *;,结果与上一次完全相同,列表中的第一项将再次是dir1。
最有可能的情况是,您的函数中有一个过多的cd ..。如果您删除其中一个,递归将在一个子目录中发生,这可能是您正在尝试执行的操作。
https://stackoverflow.com/questions/65427763
复制相似问题