如何使用find exec传递双参数批量将xlsx转为csv?
当然可以用find + -exec实现批量转换需求,而且有几种不同的写法,另外也有更简洁的批量处理方式,我来一步步给你说明:
方法一:使用find -exec结合shell脚本
因为xlsx2csv需要明确传入输入和输出文件名,我们得借助shell的字符串替换来生成对应的.csv文件名,所以需要用sh -c把转换逻辑包裹起来,让find调用这个小脚本处理每个文件:
逐个处理文件(适合少量文件)
find . -name '*xlsx' -exec sh -c 'xlsx2csv-2.7 -i --skipemptycolumns "$0" "${0%.xlsx}.csv"' {} \;
{} \;表示find把找到的每个.xlsx文件作为参数传给sh -c的$0位置${0%.xlsx}.csv是shell的参数展开语法:${变量名%后缀}会去掉变量末尾的指定后缀,这里就是把.xlsx替换成.csv
批量处理文件(更高效,适合大量文件)
上面的写法会为每个文件启动一个新的sh进程,文件多的时候效率偏低。可以用+代替\;,一次性把所有找到的文件传给shell脚本,然后用循环处理:
find . -name '*xlsx' -exec sh -c 'for f in "$@"; do xlsx2csv-2.7 -i --skipemptycolumns "$f" "${f%.xlsx}.csv"; done' _ {} +
_是占位符,用来填充sh -c的$0位置(因为$@从$1开始)$@接收find传过来的所有.xlsx文件,循环处理每个文件,只启动一次sh进程,效率更高
方法二:直接用shell循环(更简单直观)
如果你的.xlsx文件都在当前目录(或者不需要递归查找子目录),直接用shell的通配符循环更简单:
for f in *.xlsx; do xlsx2csv-2.7 -i --skipemptycolumns "$f" "${f%.xlsx}.csv" done
如果需要递归查找所有子目录里的.xlsx文件,在bash 4.0及以上版本可以开启globstar选项:
# 开启递归通配符支持 shopt -s globstar # 遍历所有层级的.xlsx文件 for f in **/*.xlsx; do xlsx2csv-2.7 -i --skipemptycolumns "$f" "${f%.xlsx}.csv" done
注意事项
- 一定要给文件名变量加双引号(比如
"$f"),避免文件名里包含空格、特殊字符(比如&、()时出现错误 - 如果
xlsx2csv-2.7不在系统的环境变量PATH里,要写完整的执行路径(比如/home/yourname/bin/xlsx2csv-2.7)
内容的提问来源于stack exchange,提问作者d-b
相关产品推荐
相关产品推荐

