在 ksh 中,我如何遍历目录列表并使用循环 cd 到它们?

In ksh how do I iterate through a list of directories and cd to them using a loop?

基本上我有一个像这样设置的平面文件:

/this/is/a/log/directory | 30

/this/also/is/having/logs | 45

/this/logs/also | 60

我想做的是提取这个平面文件的第一列,即目录路径,并检查它是否有超过 500 个日志文件。如果是,请删除除最新的 500 个文件之外的所有文件。

我正在尝试做这样的事情

#!/bin/ksh

for each in "$(awk '{ print  }' flat_file)"; do

    cd "$each";

    if [ "ls -l | wc -l >= 500" ]; then
        rm `ls -t | awk 'NR>500'`

    else
        :

    fi

done

然而,根据我的阅读,我无法像我尝试做的那样使用 for 循环从我的脚本中 cd 并且你可以从一个函数中完成它,此时我基本上只是做了一个函数并且将该代码复制到其中,当然它不起作用(对 shell 脚本不太熟悉)。类似于 Python 的 OS 模块,我可以在其中使用 os.listdir() 并传入目录名称,这将是完美的,但是我还没有找到一个简单的方法这样做的方法。

好的,您走在正确的轨道上,但是您会使查看您代码的 csh 程序员与 for each 混淆。为什么不

 for dir in $( awk '{ print  }' flat_file ) ; do
      cd "$dir"
      if (( $(ls -l | wc -l) >= 500 )); then
            rm $( ls -t | awk 'NR>500' )
         fi
      cd -
 done

您的原始代码中有很多小东西。为什么有时使用反引号,而其他时候使用首选形式的 cmd-sub $( cmd )

在 dbl-quotes 中包含你的 "$(awk '{print }' file)" 会将 cmd-substition 的完整输出变成 1 个长字符串,它不会找到名为 "dir1 dir2 dir3 .... dirn" 的目录,对吗?

您不需要空值 (:) else。您可以删除该代码块。

ksh 支持 (( .... )) 对内的数学运算(就像 bash)。

cd - 将带您回到上一个目录。

学习使用 shell debug/trace, set -vx。它会首先向您显示它将要执行的内容(有时是一个非常大的循环结构),然后它会显示执行的每一行,前面是 + 以及变量已转换为它们的值的位置。您可能还想使用 export PS4='$LINENO >',这样调试将显示正在执行的当前行号。

IHTH