Nat*_*Kup 12 ls shell ksh directory find
我写的脚本是ksh。需要在当前目录下直接找到所有只包含文件而不包含子目录的目录名。
我知道我可以使用ls -alR
并递归解析第一个字段(d
目录)中第一个字母的输出。我认为awk
是解析和查找的最佳方式。
例如,ls -al
当前目录中的简单输出:
drwxr-xr-x 22 af staff 748 18 Mar 22:21 .
drwxr-xr-x 5 root admin 170 17 Mar 18:03 ..
-rw------- 1 af staff 3 17 Mar 16:37 .CFUserTextEncoding
drwxr-xr-x 5 af staff 170 17 Mar 17:12 Public
drwxr-xr-x 9 af staff 306 18 Mar 17:40 Sites
-rw------- 1 af staff 3 17 Mar 16:37 textd
…
Run Code Online (Sandbox Code Playgroud)
此输出中有 2 个目录:Public
和Sites
. 该目录Public
不包含子目录,但包含Sites
。中有 3 个子目录Sites
。所以我只需要回显不包含目录的目录。就我而言,这只是Sites
.
int*_*lfx 18
如果你能够使用find
和“正常的Unix文件系统”(即,限定如,如果你正在寻找(1)下-noleaf选项的说明),那么下面的命令可用于:
find . -type d -links 2
Run Code Online (Sandbox Code Playgroud)
每个目录至少有 2 个名称(硬链接):.
及其名称。它的子目录(如果有)将..
指向父目录,因此具有 N 个子目录的目录将具有等于 N+2 的硬链接数。因此,搜索硬链接计数等于 2 的目录,我们搜索 N=0 子目录的目录。
因此,如果您可以使用find
,这可以说是最快的方法,并且显然优于在stat()
每个成员的目录内容上进行的外壳内循环。
小智 3
awk
你根本不需要使用。使用提供的内置测试ksh
,如下所示:
#!/bin/ksh
for NAME in *
do
FOUND=no
if [[ -d $NAME && $NAME != '.' && $NAME != '..' ]]
then
for SUBNAME in $NAME/*
do
if [[ -d $SUBNAME ]]
then
FOUND=yes
break
fi
done
if [[ $FOUND == no ]]
then
echo Found only files in $NAME
fi
fi
done
Run Code Online (Sandbox Code Playgroud)
这个小脚本会查找当前目录中的所有目录,并告诉您它们是否只包含文件,没有子目录。