linux中的find命令十分好用,特别是在需要批量处理文件时,可以用配合其他命令使用。
但是find命令本身的-exec参数实在太弱了,只能执行单一命令(无法用&&连接命令),无法多线程并行处理,对特殊文件名也无能为力。
使用find配合xargs就能比较好的处理这些情况了。
记录一下自己整理的find+xargs批量处理命令,可以解决奇葩命名,并行处理和&&连接命令的问题:
例如查找所有jpg文件,转换成webp
find . -name "*.jpg" -print0 | xargs -0 -n 1 -P 4 -I {} sh -c 'cwebp -q 40 "$1" -o "${1%.jpg}.webp" && rm "$1"' sh {}
其中find
的-print0
和xargs
的-0
配合使用,表示元素以0分隔,避免参数包含空格被截断。
xargs
的参数-n
表示一次传给要执行命令的参数个数,一般为1。-P
表示并行进程数,依照机器性能指定。
在单引号里面的内容就是要执行的命令了,用$1表示传入参数。
@