Shell脚本没有提供正确的输出

时间:2012-10-28 06:31:52

标签: shell unix

for i in `ls -lrt|grep ^d|cut -d ' ' -f 13-`
do
          cd $i
          ls
          cd ../
 done

在上面的例子中,我希望脚本进入每个目录,填充该目录的所有文件,然后进入其他目录并打印其内容。请在这里建议什么错误。

5 个答案:

答案 0 :(得分:1)

cut命令无法正常工作,因为ls -ltr输出中每个字段之间有可变数量的空格,这是由于ls格式化和可变长度文本字段的变化。从ls目录列表中解析文件名的一种更可靠的方法是用awk'{print $ 9}'替换cut命令,因此for循环应该如下所示:

for i in `ls -lrt|grep ^d| awk '{print $9}'`

答案 1 :(得分:1)

请检查字段13是否是ls命令输出的最后一个字段所需的字段。在我的系统中,它是第9个字段。所以,我已将您的代码更改为,

for i in `ls -lrt|grep ^d|cut -d ' ' -f9`
do
      echo  "Directory -$i"
      cd $i
      ls
      cd ../

done

此更改后它可以正常工作。

你也可以像sed,awk一样使用其他命令。我是用awk做的,但不是硬编码任何字段值(使用内部变量NF - 字段数,来获取最后一个字段,这应该是目录的名称)。

#for i in `ls -lrt|grep ^d|cut -d ' ' -f9`
for i in `ls -lrt|grep ^d|awk '{print $NF}'`

do
      echo  "Directory -$i"
      cd $i
      ls
      cd ../

done

这也很好。

答案 2 :(得分:0)

请执行以下任一操作吗?

ls *
ls * -r

答案 3 :(得分:0)

永远不要对“ls中的文件”进行任何变更,因为对于名称中包含空格的文件,它会失败。您所需要的只是:

find . -print

如果您想对当前目录中的每个文件执行某些操作,那么它只是

for file in *
do
    printf "Working on %s\n" "$file"
    <do stuff with "$file">
done

或所有子目录也使用xargs或:

find . -print |
while IFS= read -r file
do
    printf "Working on %s\n" "$file"
    <do stuff with "$file">
done

虽然后者与任何基于管道的解决方案一样,对于名称中带有换行符的文件将失败。

答案 4 :(得分:0)

要仅迭代当前目录中的目录,请使用模式*/,所以

for dir in */; do
    cd "$dir"
    do stuff
    cd ..
done