基本上我有一个平面文件,设置如下:
/ 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()并传入目录名称,这将是完美的,但我还没有找到一个简单的方法来做到这一点。
答案 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