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

时间:2015-12-04 00:34:10

标签: shell loops scripting ksh cd

基本上我有一个平面文件,设置如下:

/ this /是/ a / log /目录| 30

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

/ this / logs / also | 60

我尝试做的是提取此平面文件的第一列,即目录路径,并检查其中是否包含超过500个日志文件。如果是,请删除除最新的500个文件以外的所有文件。

我试图做这样的事情

#!/bin/ksh

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

    cd "$each";

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

    else
        :

    fi

done

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

您不需要空(:else。你可以消除那段代码。

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

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

学习使用shell调试/跟踪set -vx。它将首先显示它,它将执行什么(有时是一个非常大的循环结构),然后它将显示每行执行,前面有+,并且变量已转换为它们的值。您可能还想使用export PS4='$LINENO >',因此调试将显示正在执行的当前lineNo。

IHTH