从一条批处理命令说起
众所周知,程序员对单调、乏味且重复的工作充满了厌恶,对自动化和高效的批处理有这近似疯狂的迷恋。前些天笔者就碰到了一个可以批量处理的场景,也遇到了一些问题,本着探根溯源,格物致知(sheng ming bu zhi,zhe teng bu yi)的精神,着实好好折腾了一番,今天记录下自己的一些经验和思考吧。
问题背景
事情的经过是这样的,前几天我在网上下载了一些zip的压缩文件(对,你猜的没错,都是些学习资料!),大大小小有一百多个,一个个解压显然不是我的风格,必须给整点高逼格的方式把这些文件都给优雅的处理了才行。作为一个终端疯狂爱好者,很快就想到了,写条批处理的命令吧,于是就有了下面的各种尝试。
解决办法
- 遍历目录中所有zip包。本着万物皆可遍历的原则,开始了在循环体内挨个解压处理文件的操作,具体代码如下:
for file in ./*; do if test -f $file ; then dir=$(echo -e $file | sed -e 's/.zip//g') mkdir "$dir" && unzip -n "$file" -d "$dir" else echo "$file是目录文件" fi done,程序跑了一个目录,还是决定放弃这种做法,因为它可行但是不够优雅。 - 尝试使用管道命令将
awk和xargs结合的方式。于是就有了下面的命令ll | grep -E -i 'zip' | awk -F ' ' '{print $9}' | xargs -n1 -I {} unzip -n {},awk是一个强大的文本分析工具,这里我利用awk将grep搜索出来的zip文件做了分割打印,仅展示出压缩文件的文件名,然后利用xargs将awk格式化后的参数和unzip命令拼接起来,其中-n1表明每次命令使用一个参数,-I指定一个替换字符串{},这里就是用来替换压缩文件名的,命令的最终执行效果相当于执行了n次unzip,解压了n个压缩文件。 - 茴香豆的茴字一定有更多写法,这次换成
find命令尝试一次。find ./ -iname '*zip' | xargs -n1 -I {} unzip -n {},管道命令和xargs能很快的完成文件的批量解压,似乎还是不够优雅,一定有不使用管道就能完成批量解压的命令吧,查阅了一些资料,发现find本身就支持这种链接其他命令的操作,find命令中有一个-exec参数能够把find的查找结果作为拼接命令的执行参数执行,执行find . -name '*.zip' -exec unzip -n {} \;,顺利解压文件,需要注意的是终端中执行这条不加\;,会报find: -exec: no terminating ";" or "+"错误。
拓展阅读
上面我们聊到的解压操作可以替换成其他操作,比如说rm -rf批量删除,文件类型也可以替换成其他类型,比如图片类型jpeg|png, rm -rf $(ll | grep -E -i 'jpeg|png' | awk -F ' ' '{print $9}')这条命令就能批量删除当前目录下所有以jpeg或者png结尾的压缩文件。总而言之,灵活使用awk和xargs能帮助我们轻松应对大多数批处理场景。关于批处理的探讨,今天就聊到这了,后续有机会再和大家探讨一下awk和xargs诸多酷炫的使用方式。
欢迎关注我的公众号“石马非码”,原创文章第一时间推送。
