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
共有 0 条评论