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

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

4

5 回答 5

2

请检查字段 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

这也很好用。

于 2012-10-28T07:14:44.903 回答
2

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

for i in `ls -lrt|grep ^d| awk '{print $9}'`
于 2012-10-28T07:03:03.863 回答
1

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

for dir in */; do
    cd "$dir"
    do stuff
    cd ..
done
于 2012-10-28T13:20:14.717 回答
1

执行以下操作之一是否符合您的要求?

ls *
ls * -r
于 2012-10-28T06:43:58.967 回答
0

永远不要对“for file in 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

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

于 2012-10-28T07:31:10.957 回答