在 UNIX 中循环列出文件

在 UNIX 中循环列出文件

我已经发出命令:

ls -lrt

列出的文件和目录是:

drwxr-xr-x   4 root root    4096 Feb  2  2014 abc
drwxr-xr-x   4 root root    4096 Feb  2  2014 cde
drwxr-xr-x   4 root root    4096 Feb  2  2014 efg
-rwxr-xr-x   4 root root    4096 Feb  2  2014 aaa.txt

现在我想通过使用 for 循环或 while 循环来查找列出的输出文件是否是目录。

答案1

对于ls,使用以下命令仅列出目录。

ls -d -- */

要使用 ls 本身列出常规文件(并假设文件名不包含换行符),您可以使用以下命令。

ls -p | grep -v /

要仅列出常规文件,使用 GNU 和其他一些查找实现,您可以使用

find . -maxdepth 1 -type f

(请注意,与前一个相反,它还包括隐藏文件并且列表未排序)

标准等效项是:

find . ! -name . -prune -type f

答案2

如果您想要一个类似“shell 脚本模板”的东西来了解如何循环目录内容并根据文件类型执行操作,以下内容可能会给您提示:

for f in *
do
   if [[ -d "$f" ]]
   then
      ... your processing of directories here, reference them as "$f" ...
   fi
done

这将查看当前目录中的所有条目,检查它们是否是目录,并对它们执行您喜欢的任何处理。请注意,目录测试的语法是 BASH 特定的;对于一般情况,使用if [ -d "$f" ].

另一种方法将列表限制为仅目录条目:

for d in */
do
    ... whatever you need to do on directory "$d" ...
done

答案3

您不需要循环来查找所有目录,您可以使用以下find命令:

find . -maxdepth 1 -type d

这将列出当前目录中的所有目录。如果你想要ls -l输出,你可以这样做:

find . -maxdepth 1 -type d | xargs ls -ld

如果您确实想使用循环,可以使用以下构造:

for file in $(ls)
do
  if [[ -d $file ]]
  then
    ls -ld $file
  fi
done

for循环遍历 所返回的所有条目ls,然后if测试该条目是否是目录。

答案4

列出目录名称

compgen -d

不是从一个点开始

compgen -d -X '.*' | xargs ls -dlrt

相关内容