Bash Shell 通过ls
命令及其管道根据大小名称筛选文件
最近参与的项目当中有需要用pyarmor加密项目的要求,听网上吹的pyarmor都那么神,用了一下感觉也一般,试用版普通模式下文件加密居然还有大小32KB的限制,加密到一半就失败了,难绷。
失败了也不告诉别人是哪个文件大小超了,项目文件那么多,怎么好一个个去查哪个文件大于32768B?重温了一下shell,一行命令偷个懒,省得麻烦自己。
首先想到的就是ls
。详解就不说了,百度一大堆,比如这个。对于我的任务而言,ls -Rl
和ls -I
即可满足。
-R # 递归处理,将指定目录下的所有文件及子目录一并处理(列出)
-l # 以长格式显示目录下的内容列表。简单而言就是更详细的信息。
-h # 以可读方式列出,如文件大小(MB,GB而非B)
-I # 忽略特定文件。如ls -I "*.py"忽略后缀为py的文件,ls -I "tests"忽略当前目录下tests文件(夹)
正好ls -Rl
列出的每一行内容是由一列一列的元素组成的,可以通过awk
脚本进行处理。
列出的内容当中,黄色框出来的是文件大小,以字节为单位,蓝色框出来的是文件(夹)名,包括后缀。我用的是KDE的桌面所以.desktop作为应用程序链接会显示其链接到的位置,这里不用管。
不懂awk
脚本的可以了解下啥是三剑客:awk、grep、sed。
学习:awk基础用法 和 awk条件判断与正则 以及 awk变量解析
真是书到用时方恨少,初学linux时铁汁就都有讲过,只是都忘得差不多辣。。。Linux程序设计环境 实验1《Linux常用命令和Shell编程》
显然,我们取每一行第5列的值就可根据大小筛选文件了:
ls -Rl | awk '{if($5>32768) print$0}'
这样筛选出文件大小大于32768B的文件并输出整行内容。由于加密的只有.py文件,并且需要排除tests目录,正好文件名位于末尾,所以简单加个正则就能把.py文件筛出来了:
ls -Rl -I "tests" | awk '/^.*\.py$/' | awk '{if($5>32768) print$0}'