linux du命令的疑惑
起因是测试rsync传输数据。传输完成后,想看一下传输的文件是不是完整,所以检测了下源目录和目标目录的大小,竟然出现了巨大的差距:
[root@w anaconda3]$ du -sh ./
.9G ./
以及
[root@test anaconda3]# du -sh ./
4.7G ./
同样一个anaconda3目录,在新机器占用的磁盘大小竟然比源机器上多了将近2个G!!比原来的目录小还可以理解为传输问题,比原来的目录大就很奇怪了。
在去看看文件的数量是不是一致:
[root@w anaconda3]$ find ./ | wc -l
[root@test anaconda3]$ find ./ | wc -l
数量是一样的,更奇怪了,继续查看子目录大小:
[root@w anaconda3]$ ls| xargs -n du -sh
139M bin
2.0M compiler_compat
4.1M conda-meta
544K doc
envs
40K etc
56M include
.9G lib
680K libexec
.0K LICENSE.txt
52K man
2.6M mkspecs
320K phrasebooks
.6G pkgs
4.2M plugins
6.2M qml
65M share
4.7M ssl
11M translations
484K var
.0K x86_64-conda_cos6-linux-gn
[root@test anaconda3]# ls| xargs -n du -sh
139M bin
2.0M compiler_compat
4.1M conda-meta
540K doc
envs
40K etc
56M include
.8G lib
676K libexec
.0K LICENSE.txt
48K man
2.5M mkspecs
320K phrasebooks
.6G pkgs
4.2M plugins
6.2M qml
65M share
4.7M ssl
11M translations
484K var
.0K x86_64-conda_cos6-linux-gnu
对比一下,发现差距并不大啊(⊙o⊙)…,这就有点奇怪了,从结果来看新机器上"du -sh ./"的结果应该是对的,应该是老机器上执行"du -sh ./"的结果有点问题。
所以关注的重点转移到老机器上的“du”命令。
根据google到的信息,主要集中在下面几点上:
. du和ls的对比:du默认统计的是文件所占用的块的大小,操作系统分配磁盘空间是以块为单位,即使实际使用的空间不足一个块,别的文件也不能使用这个块空间。ls命令统计的是文件使用的实际空间。一般文件du命令的结果会比ls大一些,而特殊文件如“稀疏文件”,du的结果可能会小一些,这应该是和“稀疏文件”的存储方式有关。
2. du命令也可以统计实际空间,使用“-b”选项
3. du -sh ./* 和 du -sh ./ 结果可能不同,因为./*不会匹配隐藏文件,也就是“.name”以“.”开头的文件。同理du -sh * 和 du -sh 结果也可能不同
4. du和df的对比:如果某个文件被删除了,但依然有进程打开了它,那么df会计入这个文件,但du不会;稀疏文件也可能导致不同。
这几点都没有解释在老机器上运行du命令显示的奇怪结果,所以继续试试其他命令,包括列出每个文件的大小并加总等:
find ./ | xargs du -b | awk 'BEGIN {sum=0} ; {sum+=$1} END {print sum}'
find ./ -type l -o -type f| xargs du -b | awk 'BEGIN {sum=0} ; {sum+=$1} END {print sum}'
ls -l -R | awk 'BEGIN {sum=0} ; {sum+=$5} END {print sum}'
ls -a | xargs du -b | awk 'BEGIN {sum=0} ; {sum+=$1} END {print sum}'
find ./ -not -type d | xargs du | awk 'BEGIN {sum=0} ; {sum+=$1} END {print sum}'
find ./ -not -type d | xargs ls -l | awk 'BEGIN {sum=0} ; {sum+=$5} END {print sum}'
ls | xargs -n du -sb | awk 'BEGIN {sum=0} ; {sum+=$1} END {print sum}'
ll | grep -v ^d | awk 'BEGIN {sum=0} ; {sum+=$5} END {print sum}'
du -abhc ./ | wc -l
p.s. xargs命令默认是把所有参数一起放在命令行上传给程序,所以ls -a | xargs du -b的结果可能是du -b a.txt b.txt ...,而xargs -n 1di -b的结果是du -b a.txt;du -b b.txt等。
上面的命令仍然解释不了原因。
google上也提到过rsync传输后目录大小不一致的可能原因:
. 硬链接。rsync默认会把2个硬链接文件复制成两个文件,磁盘占用空间就多了一个文件的大小。
. 稀疏文件。rsync默认不会写这一类文件
检查了一番之后,似乎只有软连接,没什么硬链接。
最后没有办法,试了试VNC链接图形界面:

神奇的发现:这里的文件大小。。。也是不对的。(⊙o⊙)…
这。。。不知道怎么下手了,打算就此打住,姑且当做是一个bug吧。
另外,google上也提到了一个验证文件完整性的方法:通过checksum 校验和验证。
[root@w anaconda3]$ find . -type f \( -exec sha1sum "{}" \; \) | sort -k2, | sha1sum
ab15e4e01e363e69bf80d1d0aecdf101452f85d6 -
[root@test anaconda3]$ find . -type f \( -exec sha1sum "{}" \; \) | sort -k2,2 | sha1sum
ab15e4e01e363e69bf80d1d0aecdf101452f85d6 -
结果一致,但时间上会慢不少。
linux du命令的疑惑的更多相关文章
- LInux : du命令
Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 1.命令格式: du [选项][文件] 2.命令功能 ...
- (转)linux du命令
转自 http://www.cnblogs.com/peida/archive/2012/12/10/2810755.html Linux du命令也是查看使用空间的,但是与df命令不同的是Linux ...
- linux du命令: 显示文件、目录大小
介绍:du命令用于显示指定文件(夹)在磁盘中所占的空间信息.假如指定的文件参数实际上是一个目录,就要计算该目录下的所有文件.假如 没有提供文件参数,执行du命令,显示当前目录内的文件占用空间信息. 语 ...
- python计算文件夹大小(linux du命令 简化版)
C盘又满了,怎么办?用了一些垃圾清理软件(或者bat脚本),但是还是不理想,那么具体哪些文件夹下面有巨大的文件呢?windows并不能通过详细信息看到每个文件夹的大小(PS:这里所谓的文件夹的大小是指 ...
- Linux du命令和df命令区别
du 命令 1.命令格式: du [选项][文件] 2.命令功能: 显示每个文件和目录的磁盘使用空间. 3.命令参数: -a或-all 显示目录中个别文件的大小. -b或-bytes 显示目录或文件大 ...
- 浅谈Linux du命令
**du(disk usage),顾名思义,查看目录/文件占用空间大小** 1.查看当前目录下的所有目录以及子目录的大小 du -h du -ah #-h:用K.M.G的人性化形式显示#-a:显示目 ...
- Linux du命令详解
1.命令:du 2.命令功能:显示每个文件和目录的磁盘使用空间. 3.命令参数 -a或-all #显示目录中个别文件的大小. -b或-bytes #显示目录或文件大小时,以byte为单位. -c或-- ...
- linux sed命令使用疑惑总结
s 替换命令 [zhuhc@test111 ~]$ sed 's/ma/mass' test.txt , : unterminated `s' command 原因:替换命令s末尾的斜杠丢失了.正确命 ...
- 每天一个linux命令(34):du 命令
Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 1.命令格式: du [选项][文件] 2.命令功能 ...
随机推荐
- windows 下 方便工作的bat文件批处理命令
1.删除目录下 不包含某串字符的文件: @echo offfor /f "delims=" %%a in ('dir /s /a-d/b *.mp3') do ( echo &qu ...
- Servlet实现前后端交互的原理及过程解析
在日常调试项目时,总是利用tomcat去启动项目,并进行前后端联调,但对于前后端的请求响应的交互原理及过程并不是特别清晰. 为什么在前端发出相应请求,就能跳转到后端通过程序得到结果再响应到前端页面呢? ...
- vs2010 net4.0 c# 操作 sqlite
1.百科介绍 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是嵌入式的,而且目前已经 ...
- windows 下安装 rabbitmq报init terminating in do_boot错误
好长时间没有写东西了,记一个安装笔记吧. 目前市面上比较常用的几个消息中间件,rabbitmq算是风评比较好的,所以就拿来安装一下玩玩喽(很有可能也仅限于是安装一下....)安装过程不表,无非是下载E ...
- JDBC—DAO
一.JDBC 什么是JDBC?JAVA DataBase Connectivity (Java 数据库连接技术)由Java编写的一组类和接口组成,为各种类型的数据库提供统一的访问.JDBC的作用?一种 ...
- PKU 1129 Channel Allocation(染色问题||搜索+剪枝)
题目大意建模: 一个有N个节点的无向图,要求对每个节点进行染色,使得相邻两个节点颜色都不同,问最少需要多少种颜色? 那么题目就变成了一个经典的图的染色问题 例如:N=7 A:BCDEFG B:ACDE ...
- Discuz! 论坛
Discuz! 是腾讯旗下 Comsenz 公司推出的以社区为基础的专业建站平台,帮助网站实现一站式服务.让论坛(BBS).个人空间(SNS).门户(Portal).群组(Group).应用开放平 ...
- 54. Spiral Matrix(矩阵,旋转打印)
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...
- ACM-ICPC 2018 沈阳赛区网络预赛 G. Spare Tire (容斥原理)
可推出$a_n = n^2+n, $ 设\(S_n = \sum_{i=1}^{n} a_i\) 则 \(S_n = \frac{n(n+1)(2n+1)}{6} + \frac{n(n+1)}{2} ...
- 【转】Winform Socket通信
Socket相关概念[端口] 在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务(应 ...