通过综合练习,可以强化linux命令的学习。
带着问题学习linux命令及其相关知识,是十分有效的方法。
我们通过查询当前目录下的子目录这个问题,学习与训练linux 中一些重要命令。
综合练习强于单个命令的分散学习,知识的串联,可以打通知识结点,巩固已学知识!
本讨论关注的重要知识点:
命令;选项;参数;重定向;管道;文件及文件类型;Linux三剑客
前期准备:
以root身份在xshell中登录成功。
在/home/zhang3目录下创建一些文件(压缩文件、普通文件、目录等)
后续的所有操作都是在此目录中。
在前篇文章(Linux centos7查看目录下的目录的方法_qq_36142959的博客-CSDN博客)中,介绍了6种方法,简单实用,推荐多了解。我们在此基础上,拓展一下。以问题为起点,学习其他linux命令及方法。
1.通过压缩文件查找目录
在压缩文件学习中,常用的打包压缩命令有:gzip、zip、tar等。
在用gzip压缩文件时,不能压缩目录,仅能压缩普通文件。此方法的思路就是:我们把当前目录进行压缩,不能压缩的就是目录。把此思路用命令表达出来,就完成了我们的小目标。
命令:
gzip -q ./* |xargs ls | grep -v .gz
管道(|)处理是运用shell命令最重要的方式!
一次命令处理不一定满足要求,通过管道,把第一次的处理结果再送给后一个命令处理。如仍未满足要求,再利用管道方法继续。
常和管道方法相随的命令是grep。xargs命令也有强大功能!
在本命令中,-q选项是安静模式,不输出各种提示与错误信息。
第一项命令是采用安静模式压缩当前目录。通过管道把结果送入下一条命令。
第二项命令是把前一项命令结果查询显示出来。不加xargs命令,不能正确执行。本命令执行结果有多余信息,还需要再次处理。
第三项命令是搜索不包括.gz的文件,结果如下。
![](https://img-blog.csdnimg.cn/b979e1c250bb4daa882e3e7aaeae5ed7.png)
压缩当前目录,可以写作.、./、./*
用ls命令查看当前目录,一般文件都进行了压缩。而目录及其内容没有变化。
![](https://img-blog.csdnimg.cn/804cbf52654c4c4eaf8ae7dbda9f5d7b.png)
如果不需要对当前目录下的文件压缩,可以通过解压命令还原已压缩的文件。
gunzip *.gz
2.利用file命令查询目录
file命令不常用。主要功能是判断一个文件是哪一文件类型。通常是: file 文件名
对于把file命令用于多个文件,会有多个执行结果。
利用此命令查询当前目录下的目录,仍需要管道及grep命令
file ./* | grep "directory"
第一项命令的结果,信息太多,我们需要过滤一下。
![](https://img-blog.csdnimg.cn/e8dbbbb1eff44dbdb43e709f54d489aa.png)
3.利用sed命令查询目录
sed命令主要功能是处理文件中的行。匹配上的行可以增删改查。
为了查询目录,我们可以先为目录添加一个/标记。
命令:
ls -p |sed -n '/\/$/p'
ls -F不同文件不同标识结尾,ls -p只能给文件夹加标识“/”
\/是转义字符,表示/就是真正的/。
![](https://img-blog.csdnimg.cn/05004e69583948159d24753050df7768.png)
4.利用awk命令查询目录
awk命令主要功能是处理文本文件中的行及行中字段。为了验证awk功能强大,此处尝试利用此命令查询目录。
ls -F |awk '/\/$/'
![](https://img-blog.csdnimg.cn/78465dd489554b1dbb4fb702a68d640b.png)
ls -l ,输入结果中第二列中大于1的是目录(没有硬链接的情况下,如有硬链接此结果不准)
ls -l | awk '{if($2>1) print $0}'
![](https://img-blog.csdnimg.cn/9c581fade6f34349a4b024c6e6439d15.png)
5.利用for循环查询目录
我们利用ls可以查出当前目录下很多文件。再利用for循环对每一个文件进行识别,看是不是目录。主要知识点有反引号的使用、变量及变量调用、条件判断、echo打印输出等
可以一行录入:
for dir in `ls ./`;do if [ -d $dir ];then echo $dir;fi;done
也可以分行输入:
for dir in `ls ./`
do
if [ -d $dir ];then
echo $dir
fi
done
![](https://img-blog.csdnimg.cn/8acb9bf3ae4c44a29642344e374537c2.png)
6.编写shell脚本查询目录
编写一个查询给定目录中的目录的shell脚本,可以录入一个目录,执行脚本,查询出结果。
利用for循环编写比较简单。下面列出一个简单的脚本,仅供参考。
#! /bin/bash
# find directory
read -p "录入一个目录:" dir
echo `ls $dir` >t1.txt
for _dir in `cat t1.txt`
do
if [ -d $_dir ];then
echo $_dir
fi
done
执行脚本,录入当前目录,结果如下
![](https://img-blog.csdnimg.cn/c9b80a70fc874c3baf672eca5873413f.png)
根据颜色查询目录
此方法不可行。
为什么不能根据颜色查询目录?
一般情况下,用ls查看目录内容,可看到不同文件有不同的颜色显示,如目录常常显示为蓝色,压缩文件为红色,可执行文件为绿色,软链接文件为天蓝色,等等。
当看到列出目录这个话题时,首先想到的是找出蓝色文件,一一列出来就是目录列表了。
通过人眼判断可以快速找到结果,但用系统命令通过颜色列出目录名称不可能!原因在于,颜色不是目录的自身属性,而是shell解释器根据个人好恶添加上去的。查询结果显示不同颜色主要是方便查看,更易识别判断。当不需要时可以随时取消。所以不能通过颜色反推目录!
我们可以设置ls --color
为查询结果添加不同颜色,也可以不加此选项而取消颜色显示!!
其他文件如何设置的颜色数值,可查询文件: /etc/DIR_COLORS
其中,DIR:1;34 目录:高亮,蓝色
如果哪位高手可以实现根据颜色查询目录,欢迎指导!