删除大量小文件时,不同方法的效率差异巨大。先建立 50 万个测试文件:
for i in $(seq 1 500000); do echo text >> $i.txt; done
下面逐一对比几种删除方式。
rm 删除
time rm -f *
由于文件数量过多(超出 shell 参数长度上限),rm 直接报 argument list too long,不可用。
find + exec 删除
time find ./ -type f -exec rm {} \;
49.86s user 1032.13s system 41% cpu 43:19.17 total
约 43 分钟,非常慢。
find + delete 删除
time find ./ -type f -delete
0.43s user 11.21s system 2% cpu 9:13.38 total
约 9 分钟。
rsync 删除
先建立一个空文件夹 blanktest:
time rsync -a --delete blanktest/
0.59s user 7.86s system 51% cpu 16.418 total
仅 16 秒。
Python 删除
import os
import timeit
def main():
for pathname, dirnames, filenames in os.walk('/home/username/test'):
for filename in filenames:
file = os.path.join(pathname, filename)
os.remove(file)
if __name__ == '__main__':
t = timeit.Timer('main()', 'from __main__ import main')
print t.timeit(1)
python test.py
529.309022903
约 9 分钟。
结果对比
| 方法 | 50 万文件耗时 |
|---|---|
rm -f * |
不可用(参数过长) |
find -exec rm {} \; |
约 43 分钟 |
find -delete |
约 9 分钟 |
Python os.remove |
约 9 分钟 |
rsync --delete |
约 16 秒 |
结论:删除大量小文件,rsync 最快、最方便。