列出当前目录的所有子目录的内容 - 解析ls与globbing

时间:2011-02-11 14:36:31

标签: shell

在Peter Seebach的“Beginning Portable Shell Scripting”一书中,有一个例子列出了当前目录的所有子目录的内容:

#!/bin/sh
/bin/ls | while read file
do
  if test -d "$file"; then
   ( cd "$file" && ls )
  fi
done

我了解到解析ls很糟糕,应该优先考虑使用globing。您是否认为作者选择解析因为存在可移植性问题?

我愿意:

#!/bin/sh
for file in *
do
 if test -d "$file"; then
  ( cd "$file" && ls )
 fi
done

谢谢,

有人

2 个答案:

答案 0 :(得分:3)

两种解决方案对于奇怪的文件名都不健壮,也不处理以“。”开头的目录。我会用find来写这个,例如:

find . -maxdepth 1 -type d -exec ls '{}' ';'

但首先我会质疑实际需要什么输出,无论是对于一个人来说是眼球还是另一个要消化的脚本。

你可能能够在单个“查找”中使用for / while ... do ... done循环来解决大量进程分支的问题。

答案 1 :(得分:2)

Globbing is much preferred over parsing ls因为它将处理包含空格和其他字符的文件名。

对于您问题中的具体情况,您可以使用以下内容:

ls */