小知识:Linux如何删除大量小文件
环境:RHEL 6.5 + Oracle 11.2.0.4
需求:使用df -i巡检发现Inodes使用率过高,需要清理删除文件来解决。如果Inodes满,该目录将不能写,即使df -h查看还有剩余空间。
1.问题现象
Oracle的adump下记录的是sys的登陆审计信息,特点是小碎文件非常多,经常会遇到使用rm -rf *命令删除不了,报错-bash: /bin/rm: Argument list too long。
这是因为通配符*在执行时会替换为具体的文件名,例如rm -rf file1 file2 file3 ...,如果文件数量过多,就容易出现这个错误。
比如在下面的环境中,adump目录下文件已达到114万+,执行rm -rf *命令时就会报这个错误:
[oracle@jystdrac2 adump]$ pwd
/opt/app/oracle/admin/crmdb/adump
[oracle@jystdrac2 adump]$ ls|wc -l
1149787
[oracle@jystdrac2 adump]$ rm -rf *
-bash: /bin/rm: Argument list too long
[oracle@jystdrac2 adump]$ du -sh
4.4G
2.解决方案
清楚了问题现象,解决方案就从除去rm -rf *命令的方式之外,还有哪些方法可用,如果通过网络搜索,可能会找到结合find命令再去执行rm的方式,但其实效率非常差,具体写法这里就不列出了,因为我们通常也不会这样处理。那么如何较为效率的删除大批小文件呢?结合网络的经验,并实测验证,最终总结了两种常见的解决方案,效率上也都尚可。
方案一:巧用rsync的方式达到删除目的
建立一个空文件夹,使用rsync --delete-before -d <空文件夹> <需要清理删除小文件的目录>命令最终达到删除大批小文件的目的。下面演示具体操作:
[oracle@jystdrac2 adump]$ mkdir /data/null
[oracle@jystdrac2 adump]$ ls -l /data/null
total 0
[oracle@jystdrac2 ~]$ nohup rsync --delete-before -d /data/null/ /opt/app/oracle/admin/crmdb/adump/ &
使用man rsync查看rsync命令相关的参数说明如下:
-d, --dirs transfer directories without recursing
--delete-before receiver deletes before transfer (default)
方案二:使用find命令的delete参数
使用find <需要清理删除小文件的目录> -type f -delete命令直接删除大批小文件。
使用man find查看find命令相关的参数说明如下:
-type c
File is of type c:
b block (buffered) special
c character (unbuffered) special
d directory
p named pipe (FIFO)
f regular file
l symbolic link; this is never true if the -L option or the -follow option is in effect, unless the symbolic link is broken. If you want to
search for symbolic links when -L is in effect, use -xtype.
s socket
D door (Solaris)
-delete
Delete files; true if removal succeeded. If the removal failed, an error message is issued. If -delete fails, find’s exit status will be nonzero
(when it eventually exits). Use of -delete automatically turns on the ‘-depth’ option.
Warnings: Don’t forget that the find command line is evaluated as an expression, so putting -delete first will make find try to delete everything
below the starting points you specified. When testing a find command line that you later intend to use with -delete, you should explicitly spec-
ify -depth in order to avoid later surprises. Because -delete implies -depth, you cannot usefully use -prune and -delete together.
下面演示具体操作:
[oracle@jystdrac1 adump]$ nohup find /opt/app/oracle/admin/crmdb/adump/ -type f -delete &
可以参考下面的命令来简单监控删除过程中Inodes使用率的变化:
while true; do df -i /; sleep 10; done
比如我这里节点jystdrac1使用的find方法,节点jystdrac2使用的rsync方法,实际观察Inodes释放速度区别并不大:
# 使用的find方法,观察Inodes释放速度:
[oracle@jystdrac1 ~]$ while true; do df -i /; sleep 10; done
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_linuxbase-lv_root 1806896 1519124 287772 85% /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_linuxbase-lv_root 1806896 1519015 287881 85% /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_linuxbase-lv_root 1806896 1513880 293016 84% /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_linuxbase-lv_root 1806896 1511132 295764 84% /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_linuxbase-lv_root 1806896 1502434 304462 84% /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_linuxbase-lv_root 1806896 1494583 312313 83% /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_linuxbase-lv_root 1806896 1489111 317785 83% /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_linuxbase-lv_root 1806896 1487629 319267 83% /
# 使用的rsync方法,观察Inodes释放速度:
[oracle@jystdrac2 ~]$ while true; do df -i /; sleep 10; done
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_linuxbase-lv_root 1806896 963029 843867 54% /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_linuxbase-lv_root 1806896 955037 851859 53% /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_linuxbase-lv_root 1806896 953088 853808 53% /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_linuxbase-lv_root 1806896 950523 856373 53% /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_linuxbase-lv_root 1806896 948754 858142 53% /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_linuxbase-lv_root 1806896 944613 862283 53% /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_linuxbase-lv_root 1806896 942619 864277 53% /
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg_linuxbase-lv_root 1806896 938510 868386 52% /
既然两种方式差异不算大,那就根据需求或个人习惯选择即可。我自己更倾向于使用方案二,因为这样无需创建空目录,操作上也更直观。
最后再总结下删除大量小文件的方法:
# 方案一:
mkdir <空文件夹>
rsync --delete-before -d <空文件夹> <需要清理删除小文件的目录>
# 方案二:
find <需要清理删除小文件的目录> -type f -delete
相对来说这两种方式都比较效率,但由于整体小文件也是比较多,所以实际可以选择nohup放到后台执行。
小知识:Linux如何删除大量小文件的更多相关文章
- Linux 快速删除大量小文件方法
进行以下两步操作即可: 1.第一步:创建空的文件夹: mkdir /tmp/blank 2.第二步:执行以下命令:rsync --delete-before -d /tmp/blank/ /home ...
- Linux中删除特殊名称文件的多种方式
今日分享:我们在肉体的疾病方面花了不少钱,精神的病害方面却没有花什么,现在已经到了时候,我们应该有不平凡的学校.--<瓦尔登湖> 前言 我们都知道,在linux删除一个文件可以使用rm命令 ...
- linux下删除文件名乱码文件
linux下通过rm命令来删除文件,但是如果要删除文件名乱码的文件,就不能直接使用rm命令了,因为压根就无法输出文件名来.不过借助find命令可以实现对其删除.在linux下对于每个文件都一个对应的不 ...
- linux 查找删除找定文件
find . -name "*.lastUpdated" -exec rm -rf {} \; 这个命令是find的基本用法,可以分两部分,find ~/ -name " ...
- linux下删除大量小文件
当目录下文件太多时,用rm删除文件会报错:-bash: /bin/rm: Argument list too long提示文件数目太多.解决的办法是使用如下命令:ls | xargs -n 10 rm ...
- Python小练习:批量删除多个文件夹内的相同文件
应用场景: 下载的多个文件夹是压缩包,解压后每个文件夹都有某个网站的推广链接,想要批量的删除该文件 使用环境:win7,python3.6 代码: 1.直接用for循环 由于os.walk()方法自带 ...
- 初始CSS3小知识【99%人不知道的小技巧】
一.引入样式 1.行内样式表 <h1 style="color: red;font-size: 18px;">10-30</h1> 2.内 ...
- linux 下删除乱码的文件夹
[keke.zhaokk@gw2.mpi2.cm10 /home/keke.zhaokk] $ls -i 85082119 dataMining 85082939 ????֦???-???idޢ??? ...
- Linux上删除大量文件几种方式对比
目录 Linux上删除大量文件几种方式对比 1. rm删除:因为文件数量太多,rm无法删除(报错) 2. find查找删除:-exec 3. find查找删除:xargs 4. find调用-dele ...
- Linux小知识:rm -rf/*会将系统全部删除吗
Linux小知识:rm -rf/*会将系统全部删除吗 本文是学习笔记,视频地址为:https://www.bilibili.com/video/av62839850 执行上面的命令并不会删除所有内容( ...
随机推荐
- 如何用 Serverless 一键部署 Stable Diffusion?
思路 其实很简单, 我们只需要将镜像里面的动态路径映射到 NAS文件存储里面即可,利用 NAS 独立存储文件模型,扩展,语言包等,并且我们可以为管理 NAS 单独配置一个可视化的后台,用简单的文件上传 ...
- 本地存储sessionStorage、localStorage
本地存储特性 数据存储在用户浏览器中 设置.读取方便.甚至页面刷新不丢失数据 容量较大,sessionStorage约5M.localStorage约20M 只能存储字符串,可以将对象JSON.str ...
- SpringCloud Alibaba Security安全认证
一. Security配置(auth认证中心) 代码地址 https://github.com/typ1805/blog-cloud Spring Security是一套安全框架,可以基于RBAC(基 ...
- ASP.Net Core 5.0 MVC log4net日志的添加
1. 引入程序集 Microsoft.Extensions.Logging.Log4Net.AspNetCore 及 log4net 2. 添加配置文件log4net.Config, 并将属性改为& ...
- Python-函数-算术函数
#python-函数-算术函数 #(1)加减乘除 #加法 add(),减法 subtract(),乘法 multiply(),除法 divide() #作用:数组间的加减乘除 import numpy ...
- Meta AI新发布的超大规模语言模型-OPT-175B
Meta AI在2022年5月3日新发布的OPT-175B模型,该模型是现阶段第一个模型参数超过千亿级别的开放模型,其次该模型与GPT-3相比,更加开放及便于访问. 具体开放性表现在如下几个方面: ...
- 问题--在C++使用strcpy等函数时发生C4996报错
1.问题如下: C4996:'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To ...
- 【SHELL】查找包含指定字符串的目录、在找出的路径中找出指定格式的文件、并统计出数量
查找包含字符串"skull"的目录.在找出的路径中找出格式".c/.cpp/.h"的文件.并统计出数量 find . -path ./out -prune -o ...
- Laravel : 模糊查询 where orWhere
Banner::where('title', 'like', "%{$keyword}%")->orWhere('introduce', 'like', "%{$k ...
- Git-分支-branch-checkout-merge