1. 前言
在Linux环境下进行文件复制,通常就是用cp命令。对于绝大多数人来说,由于它的通用性,该命令已经倒背如流。近来工作要频繁对文件进行复制,然后再进行处理。可不幸的是,常用的cp命令用起来却是好慢好慢。
为了提高效率,便打开谷歌搜索,寻找更好的解决方案。智一面小编经过调研,得到了其余几个复制的命令,为了帮助大家,特意将命令分享如下(如果不想了解过程的,想直接看结论的同学可以直接翻到文章末尾)。
下面就以指定的文件夹(/home/learn/files)为例进行实验和对比,为了让大家对该文件夹有更加直观的认识,先使用shell命令进行文件大小的分布情况进行统计。分为以下几个段大小进行统计:小于1K、 1K - 4K、 4K - 1M、1M - 10M、 10M - 1G、 1G 以上:
bins=('0-1k','1k-4k','4k-1m','1m-10m','10m-1g','1g-inf')
ls -Rla | awk '{print $9, $5}' | column -t | awk -v bins_str=$bins 'BEGIN{split(bins_str,bins,",");ttl=0} ($2 <= 1024) {a[1]++} (1024 < $2 && $2 <= 4096) {a[2]++} (4096 < $2 && $2 <= 1048576) {a[3]++} (1048576 < $2 && $2 <= 10485760) {a[4]++} (10485760 < $2 && $2 <= 1073741824) {a[5]++} (1073741824 < $2 ) {a[6]++} {ttl++} END {for(i=0;i<length(a);++i) print bins[i],a[i],"percentiles:",(a[i]/ttl)*100,"%"}'
结果如下所示:
范围 | 个数 | 比例 |
---|---|---|
0-1k | 51952 | 99.7964% |
1k-4k | 4 | 0.00768374% |
4k-1m | 41 | 0.0787583% |
1m-10m | 5 | 0.00960467% |
10m-1g | 56 | 0.107572% |
2. 命令一: cp
time cp -a /home/learn/files /home/learn/test/cp
real 6m7.699s
user 0m0.568s
sys 0m48.372s
3. 命令二:tar
time (cd /home/learn/files; tar c .) | (cd /home/learn/test/tar ; tar x)
real 2m7.848s
user 0m1.209s
sys 1m12.826s
4. 命令三:rsync
time (cd /home/learn/files; rsync -a . /home/learn/test/rsync)
real 9m14.021s
user 4m8.799s
sys 3m10.757s
5. 命令四:cpio
time (cd /home/learn/files; find . -xdev) | cpio -pmd /home/learn/test/cpio
real 9m23.032s
user 0m7.435s
sys 1m35.024s
6. 结论
命令 | 时间 |
---|---|
cp | 6m7.7s |
tar | 2m7.8s |
rsync | 9m14s |
cpio | 9m23s |
tar命令是最快的。
rsync虽然速度很慢,但是它支持断点续传。所以它可以用来复制差异文件。
运维工程师QQ在线交流群:580175957