Linux-Shell脚本-递归遍历输出指定目录中所有文件的类型

做实验的时候,题目看错了…
不要求递归的东西,我递归了…
虽然实验起来效果更好,但头发也更少了…
宝宝心里苦…

使用方法

以目录作为参数传入脚本,
即使用sh traveDir.sh dir来输出dir目录下的各文件信息。

脚本效果

将dir目录下的所有文件类型输出,
如果是目录文件,会输出 文件名是目录
如果不是目录文件,会输出 文件名是文件
并且,如果是目录,还会再对该目录执行一次输出操作。
即,会将目录下的子目录,以及子目录的子目录中的所有文件类型输出。

效果图示

以用户目录作为参数:
sh traveDir.sh ~

代码

虚拟机的vmware tools坏了好像,之前能复制粘贴的,现在不行了,不过代码量不大,三十行不到。

代码思路

获取文件信息:
需要获取文件名以及文件类型,选择使用ls -l命令,
但ls -l会获取到两行,不方便处理,因此需要使用正则表达式grep匹配,
文件类型这行,会有文件权限,有写权限,则有w字符,否则该位置会被-代替,因此正则表达式匹配这两个字符即可。

for in信息处理:
在for in中,会用默认的分隔符分割,而ls -l的输出中,空格会被当成分隔符,
为了方便后续处理,将默认分隔符留下副本,再将其改成换行符。
此时for in获得的是一行的ls -l信息。

分割并获得所需数据:
将分隔符恢复,将ls -l信息分割成数组形式,
则,数组最后一个是文件名,无需处理
数组第一个是文件类型+文件权限
只有文件类型是需要的,因此将其转换成字符串后,使用字符串分割,获得第一个字符,即文件类型字符。

类型判断:
在Linux中,一切皆文件,而在此处,我们只认为目录文件是目录,非目录文件是文件,
因此,判断文件类型是否为d,是,则输出 文件名是目录,
反之则输出 文件名是文件。

递归调用:
判断文件是否为目录,如果是,则将目录作为参数调用本函数。
而在这里,除了使用文件类型是否为d来判断,还能使用 -d 文件名 来判断(如代码中递归部分的判断条件)。

非递归遍历输出文件类型

将上面的递归调用代码删去即可。
即22行至25行。

参考文献

Emperor_Dandy: 使用Shell遍历目录及其子目录中的所有文件方法,https://www.jb51.net/article/142325.htm

You may also like...

发表评论

邮箱地址不会被公开。 必填项已用*标注