我写的脚本是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
…
此输出中有 2 个目录:Public
和Sites
。该目录Public
不包含子目录,但Sites
包含子目录。中有3个子目录Sites
。所以我只需要回显其中不包含目录的目录。就我而言,这只是Sites
.
答案1
如果您能够使用find
并且正在使用“普通 Unix 文件系统”(即,如查找(1)在下面-无叶选项描述),则可以使用以下命令:
find . -type d -links 2
每个目录至少有 2 个名称(硬链接):.
及其名称。它的子目录(如果有)将指向..
父目录,因此具有 N 个子目录的目录的硬链接计数将等于 N+2。因此,在搜索硬链接计数等于 2 的目录时,我们搜索具有 N=0 子目录的目录。
因此,如果您可以使用,这可以说是最快的方法,并且明显优于对其每个成员进行find
目录内容的 shell 内循环。stat()
答案2
*/
匹配当前目录的子目录。这包括您可能需要也可能不希望的目录符号链接。
在 ksh93 中,~(N)
如果没有匹配项,在模式的开头添加会使它扩展到空列表。如果没有这个,如果没有匹配,模式将保持不变。
以下 ksh93 函数列出当前目录中不包含任何子目录或目录链接的子目录。
list_leaf_directories () {
local FIGNORE='.?(.)' # don't ignore dot files
local d
for d in */; do
[[ -L $d ]] || continue; # skip symbolic links
set -- ~(N)"$d"/*/
if ((!$#)); then echo "$d"; fi
done
done
答案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
这个小脚本会查找当前目录中的所有目录,并告诉您它们是否只包含文件,没有子目录。
答案4
如果我没有误解你的意思,你只想在目录中查找文件而不是子目录。如果这是您的意图,这就是解决方案
find . -type f
如果您想查找常规文件以外的文件(例如块设备文件、字符设备文件等),请参阅find
命令的手册页并查找类型该页面上的关键字。您将看到不同的文件类型,包括常规文件和目录等。
希望这就是您正在寻找的