shell脚本,判断一个目录内是文件还是子目录

一个目录,例如/opt,目录内(即ls/opt列出的结果)要么全是目录,要么全是文件(regularfile)如何判断是哪种情况?当然,最土的方法就是用ls列出来,然后随... 一个目录,例如/opt,目录内(即ls /opt列出的结果)要么全是目录,要么全是文件(regular file)
如何判断是哪种情况?

当然,最土的方法就是用ls列出来,然后随便拿一个文件来判断。
但现在需要一个尽量高效快速的方法。不知道是否有?
展开
 我来答
不知详解
2012-12-02 · 知道合伙人软件行家
不知详解
知道合伙人软件行家
采纳数:609 获赞数:2252
自学计算机。

向TA提问 私信TA
展开全部
你能不能一次把问题提完整呢。
shell 没有提供处理文件系统的底层功能。
可以使用重定向,在得到一行后就立刻匹配,完成后立刻退出。它不需要等到ls命令完成。可以操作目录下存在大量文件的情况。
效率最快的是这个:

ls /opt -1F --sort=none | ( read LINE;echo "$LINE"| if grep -q "/$" ; then exit 0 ;else exit 1 ; fi ;)

这个命令返回0 表示/opt 目录下存在目录(不代表全部都是目录,这条命令基于你在问题中的假设)。返回非0表示包含非目录文件。
-1 表示ls 输出一行个文件。
-F 表示输出的每个文件后缀一个符号表示文件类型,文件夹的后缀为 /
--sort=none 表示按照磁盘存储顺序进行输出,不进行排序。
|grep -q '/$' 表示 如果匹配到/ 结尾的行。

最近几天你提的问题相当零散。都不知道你的思维对不对。
shell 本身就不是高效率的语言。想要高效率应该使用其他脚本语言,例如perl 。
更多追问追答
追问
ls /opt -1F --sort=none 这个命令确实如你所说。
可以后面命令貌似没捕获到结果啊,麻烦再看一下:
#!/bin/bash
result=`ls /opt -1F --sort=none | ( read LINE;echo "$LINE"| if grep -q "/$" ; then exit 0 ;else exit 1 ; fi ;)`
echo $result

运行之后输出空的(一个空行)。请帮忙看看是为什么
追答
这个命令是依靠返回值工作的,不是依靠输出的。
ls /opt -1F --sort=none | ( read LINE;echo "$LINE"| if grep -q "/$" ; then exit 0 ;else exit 1 ; fi ;)

if [ $? == 0] ;then
echo dir
else
echo other files
fi
百度网友5311d79
2012-12-02 · TA获得超过1.9万个赞
知道大有可为答主
回答量:6356
采纳率:71%
帮助的人:3211万
展开全部
说下几种思路:
1) find . -type f
2) find ! -type d
3) ls -Rl | awk 'NF>2&&/^[^d]/'
这三种情况可作相同判断:如果结果为空,那就全是目录。

在上述命令后加 >/dev/null 2>&1,然后判断:
if [ $?-eq 0 ]; then
echo "All are files."
else
echo "All are directories."
fi
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式