Linux 下 ls 和 du 计算的文件差别那么大

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Linux 下 ls 和 du 计算的文件差别那么大?排查后结果竟是这样

事情是这样的,昨天开发让我给他倒个日志,由于历史原因吧,没有日志系统,直接上服务器看了下他要的日志大小

[root@xxxxx apps]# du -hs smartorder.log
9.0G smartorder.log

看了下,不小,我问开发,要整个日志吗,还是可以按日期给他切一下,他说要整个,我想着日志文件,通常压缩完也没多少,就压缩了一下,压缩完确实也不是太大

[root@xxxxx apps]# du -hs smartorder.log.tar.gz
744M smartorder.log.tar.gz

没多想,我就给他down下来发过去了

晚上回家,哥们找到我了

图片.png

我说不可能啊,怎么可能100G,吓到我了,他还给我发了个截图

图片.png

确实是100G,没办法,开电脑上服务器查看,通过ls指定--block-size查看大小

[root@xxxxx apps]# ls -l --block-size=G smartorder.log
-rw-r--r-- 1 root root 103G Oct 21 09:00 smartorder.log

这。。。。。

后来想起来,du查找的时候是按照block大小计算的,计算的是实际占用磁盘空间的大小,但即便这样,按道理,和ls命令查出来的大小不会差太多,但是凡事有例外

linux中有一种文件叫做sparse file,它可以延迟分配磁盘空间,类似于我们用的虚拟机,在创建虚拟机的时候,可以分配20G的磁盘空间,但是你创建完后,去查看宿主机磁盘占用,确实际没有占用那么多

Sparse File专业名称叫稀疏文件,这是Unix类和NTFS等文件系统的一个特性

开始时,一个sparse file不包含数据,也没有分配到用来存储用户数据的磁盘空间。当数据被写入sparse file时,NTFS逐渐为其分配磁盘空间。

Sparse File以64KB为单位增量增长,所以磁盘上sparse file的大小总是64KB的倍数

Sparse File就是在文件中留有很多空余空间,留备将来插入数据使用。如果这些空余空间被ASCII码的NULL字符占据,并且这些空间相当大,那么,这个文件就被称为稀疏文件,而且,并不分配相应的磁盘块。

很显然,我上面遇到的就是一个Sparse File,那么这么大的一个sparse file,怎么处理?

其实cp命令有一个针对sparse文件拷贝优化的参数--spare=WHEN,WHEN的值为auto、always、never,默认为auto,如果设置为never则会自动填数据

同样支持sparse的命令还有tar、cpio、rsync,下面通过tar试下

[root@bibang-server apps]# tar cSf smartorder.log.tar smartorder.log
[root@bibang-server apps]# ls -l --block-size=G smartorder.log.tar
-rw-r--r-- 1 root root 10G Oct 21 09:57 smartorder.log.tar

如何查找系统上的sparse file,或确认文件是否是sparse file?

[root@xxxxx apps]# find ./smartorder.log -type f -printf "%S\t%p\n"
0.0886597 ./smartorder.log

如上,通过find命令,find命令通过%S输出的结果中,最左边一列显示的值是(BLOCK-SIZE*st_blocks/st_size),sparse file的大小通常是小于1.0的

如果要查找文件系统上所有稀疏文件,可以通过以下find命令

find / -type f -printf "%S\t%p\n" | gawk '$1 < 1.0 {print}'

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
打赏
0
0
0
0
2220
分享
相关文章
|
7天前
|
Linux基础:文件和目录类命令分析。
总的来说,这些基础命令,像是Linux中藏匿的小矮人,每一次我们使用他们,他们就把我们的指令准确的传递给Linux,让我们的指令变为现实。所以,现在就开始你的Linux之旅,挥动你的命令之剑,探索这个充满神秘而又奇妙的世界吧!
53 19
|
21天前
|
Linux 常用文件查看命令
`cat` 命令用于连接文件并打印到标准输出,适用于快速查看和合并文本文件内容。常用示例包括:`cat file1.txt` 查看单个文件,`cat file1.txt file2.txt` 合并多个文件,`cat &gt; filename` 创建新文件,`cat &gt;&gt; filename` 追加内容。`more` 和 `less` 命令用于分页查看文件,`tail` 命令则用于查看文件末尾内容,支持实时追踪日志更新,如 `tail -f file.log`。
46 5
Linux 常用文件查看命令
Linux|Transfer.sh 轻松实现文件共享
Linux|Transfer.sh 轻松实现文件共享
36 2
Linux|Transfer.sh 轻松实现文件共享
linux怎么把文件传到docker里面
在现代应用开发中,Docker作为流行的虚拟化工具,广泛应用于微服务架构。文件传输到Docker容器是常见需求。常用方法包括:1) `docker cp`命令直接复制文件;2) 使用`-v`选项挂载宿主机目录,实现数据持久化和实时同步;3) 通过SCP/FTP协议传输文件;4) 在Dockerfile中构建镜像时添加文件。选择合适的方法并确保网络安全是关键。
134 1
|
2月前
|
Linux 将所有文件和目录名重命名为小写
Linux 将所有文件和目录名重命名为小写
39 3
|
4天前
|
linux命令详细说明以及案例
本文介绍了常用的 Linux 命令及其详细说明和示例,包括:`ls`(列出目录内容)、`cd`(更改目录)、`rm` 和 `mv`(删除与移动文件)、`grep`(搜索文本)、`cat`(显示文件内容)以及 `chmod`(更改文件权限)。每个命令均配有功能描述、选项说明及实际案例,帮助用户更好地掌握 Linux 命令的使用方法。
83 56
|
4天前
|
linux常用命令详细说明以及案例
本文介绍了Linux中几个常用的命令及其用法,包括:`ls`(列出目录内容)、`cd`(切换目录)、`mkdir`(创建目录)、`rm -p`(删除目录及内容)和`mv`(移动或重命名文件/目录)。每个命令都配有详细说明、语法格式、常见选项及实用案例,帮助用户更好地理解和使用这些基础命令。内容源自[linux常用命令详细说明以及案例](https://linux.ciilii.com/show/news-285.html)。
|
2月前
|
Linux系统之whereis命令的基本使用
Linux系统之whereis命令的基本使用
106 24
Linux系统之whereis命令的基本使用