多语言(Batch, BASH, Octave, Emacs Lisp, ..)批量处理文件

楔子

有人提了一个问题 如何用C语言编程实现批量处理一个目录里面的所有文件 想起我自己也做过类似的事 就把自己的解决方案分享出来 写完觉得不过瘾 总结一下我的实现方案

以下的方案牵扯可执行文件的时候 都假设这个文件名字是a 读取一个参数进行处理 后面有些只是实现了列举 简单总结一下而已

Batch

1
for /f "delims=" %%i in ('"dir /b *.txt"') do a.exe %%i

我很不喜欢Batch 觉得语法好恶心 但百度一下还是能写出来 要点是 dir/b参数实现只输出文件名 完美解决

BASH Shell

写BASH脚本有一种回家的感觉

1
2
3
4
5
#!/bin/sh
for i in *.txt
do
./a.out "${i}"
done

简洁 高效

如果再加一个&就并行了 当然Batch也可以并行的 加start

GNU Octave

1
2
3
4
5
data_files = dir("*.txt");
for i = 1:length(data_files);
[a b] = textread(data_files(i).name, "%d%f");
## Do something.
end

GNU Octave是Matlab的开源替代 这里有一个专门的函数 也很简单清晰

这是以前写的 删掉了处理数据的部分 做个例子

Emacs Lisp

1
2
(let ((default-directory "/tmp"))
(mapc #'find-file (file-expand-wildcards "*.txt")))

这里也是简单演示一下打开这些文件 mapc 好简洁

Python

搜索来的 用这个库很容易实现

1
2
3
#!/usr/bin/env python2
import glob
print(glob.glob('/tmp/*.txt'))

下面留个坑

NodeJS

总结

C因为没有专门的库函数实现 只能用平台相关的 而各种跨平台的语言或软件都能很好的解决这个问题 如果只是要"quick-and-dirty"的解决方案 用各种脚本会好很多 特别是Batch和BASH Shell