在 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
基本上我有一个像这样设置的平面文件:
/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