欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

linux rm 文件夹内文件太多 Linux中RM快速删除大量文件/文件夹方法 有大用 有大大用 有大大大用

Linux快速删除目录中的大量文件

所属分类:Linux

在业务运行时,没有制定日志清除规则,导致在日志目录下保存了大量的日志文件。在使用rm -rf $dir删除旧的日志时,会提示-bash: /bin/rm: Argument list too long,通过ls |xargs rm -rf也可以进行删除,但是会耗费大量的时间。在网上找到一种快速删除大量文件的方法rsync,有点类似MySQL的truncate table。

具体操作方法  为什么我在红帽5上试了 rsync 特别的慢

  1. # 先创建一个空目录

  2. # 注意:最好是用和被清空目录的所有者(用户)去创建这个空目录,使用的命令会将空目录的权限带过去

  3. mkdir /tmp/empty

  4. # 清除目标目录的文件,不要忘记两个目录后面都要有斜杠 '/' 

  5. rsync --delete-before -av /tmp/empty/ /var/log/target/

选项说明

  1. -delete-before 接收者在传输之前进行删除操作

  2. -a 归档模式,表示以递归方式传输文件,并保持所有文件属性

  3. -v 详细输出模式

rsync快的原因

  1. rm删除内容时,将目录的每一个条目逐个删除(unlink),需要循环重复遍历很多次;

  2. rsync删除内容时,建立好新的空目录,替换掉老目录,不需要进行大量的遍历操作。


来自 https://www.u22e.com/2623.html

在linux上使用rm -rf删除海量文件非常慢,慢到无法等待到结果,慢到无法接受,慢到怀疑生命。先分析一下为什么rm 删除文件慢,然后给出解决方法

1.为什么rm删除大量文件很慢

rm命令大量调用了lstat64和unlink,可以推测删除每个文件前都从文件系统中做过一次lstat操作。过程:正式删除工作的第一阶段,需要通过getdirentries64调用,分批读取目录(每次大约为4K),在内存中建立rm的文件列表;第二阶段,lstat64确定所有文件的状态;第三阶段,通过unlink执行实际删除。这三个阶段都有比较多的系统调用和文件系统操作。

2.使用rsync解决删除慢的问题

rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync。rsync是Linux系统下的文件同步和数据传输工具,它采用“rsync”算法,可以将一个客户机和远程文件服务器之间的文件同步,也可以在本地系统中将数据从一个分区备份到另一个分区上。

rsync所做的系统调用很少:没有针对单个文件做lstat和unlink操作。命令执行前期,rsync开启了一片共享内存,通过mmap方式加载目录信息。只做目录同步,不需要针对单个文件做unlink。

rsync删除文件的原理就是把一个空文件夹同步到有很多文件的文件夹

2.1安装rsync 命令

yum install rsync

2.2 rsync删除文件夹

先建立一个空目录

mkdir -p /root/blank

用rsync删除目标目录

rsync --delete-before -d /root/blank/ /root/edatacache/           #原文中说不要忘记两个文件夹后的“/”

这样/root/edatacache目录就被快速的清空了。

2.3 和删除有关的选项

rsync –help | grep delete

–del an alias for –delete-during

–delete delete files that don’t exist on the sending side

–delete-before receiver deletes before transfer (default)

–delete-during receiver deletes during transfer, not before

–delete-after receiver deletes after transfer, not before

–delete-excluded also delete excluded files on the receiving side

–ignore-errors delete even if there are I/O errors

–max-delete=NUM don’t delete more than NUM files

其中–delete-before 接收者在传输之前进行删除操作

2.4 rsync 选项参数说明

–delete-before 接收者在传输之前进行删除操作

–progress 在传输时显示传输过程

-a 归档模式,表示以递归方式传输文件,并保持所有文件属性

-H 保持硬连接的文件

-v 详细输出模式

–stats 给出某些文件的传输状态

-d transfer directories without recursing

2.5 使用rsync删除大文件

和删除文件夹的原理一样

创建一个空文件

touch /root/empty.txt

用rsync清空/root/data.txt文件

rsync --delete-before -d --progess --stats /root/empty.txt /root/data.txt


来自  https://blog.csdn.net/weixin_33437453/article/details/116632434

linux无需rm就可快速删除大量文件--- rsync --delete-before -a -H -v --progress --stats

 
格式:
rsync --delete-before -a -H -v --progress --stats
选项:

--delete-before 接收者在传输之前进行删除操作
-progress 在传输时显示传输过程
-a 归档模式 表示以递归方式传输文件,并保持所有文件属性
-r 对子目录以递归方式处理
-H 保持硬连接的文件
-v 详细输出模式


举例说明:
/home/aniya/ 是一个空文件夹【无任何子目录以及文件】,/home/zhaoyj目录下有很多文件,现在要将这个目录下的N多个文件清空
[root@XKWB5705 home]# rsync --delete-before -a -H -v --progress --stats /home/aniya/ /home/zhaoyj
building file list ...
13 files to consider
./
.bash_history
2032 100% 0.00kB/s 0:00:00 (xfer#1, to-check=11/13)
.bash_logout
33 100% 8.06kB/s 0:00:00 (xfer#2, to-check=10/13)
.bash_profile
176 100% 21.48kB/s 0:00:00 (xfer#3, to-check=9/13)
.bashrc
124 100% 15.14kB/s 0:00:00 (xfer#4, to-check=8/13)
.viminfo
557 100% 45.33kB/s 0:00:00 (xfer#5, to-check=7/13)
.mozilla/
.mozilla/extensions/
.mozilla/plugins/
Maildir/
Maildir/cur/
Maildir/new/
Maildir/tmp/


Number of files: 13
Number of files transferred: 5
Total file size: 2922 bytes
Total transferred file size: 2922 bytes
Literal data: 2922 bytes
Matched data: 0 bytes
File list size: 297
File list generation time: 0.022 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 3513
Total bytes received: 178


sent 3513 bytes received 178 bytes 7382.00 bytes/sec
total size is 2922 speedup is 0.79
---------------------------------------------------------------------------------------------------------------------------------------------


当源和目的文件性质不一致的时候会报错的:
[root@XKWB5705 /]# rsync --delete-before -a -H -v --progress --stats /varOLD/ /aniya/usr.tar.gz
building file list ...
1 file to consider
ERROR: cannot overwrite non-directory with a directory
rsync error: errors selecting input/output files, dirs (code 3) at main.c(488) [receiver=2.6.8]
rsync: connection unexpectedly closed (8 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(463) [sender=2.6.8]
[root@XKWB5705 /]# ls -l aniya/
total 1049844
-rw-r--r-- 1 root root 1073982015 Sep 15 21:09 usr.tar.gz
---------------------------------------------------------------------------------------------------------------------------------------------
haha.txt 是空文件,usr.tar.gz是1.1G的压缩包,现在是把usr.tar.gz的大小由1.1G变成0【即清空文件包】


[root@XKWB5705 /]# touch /varOLD/haha.txt
[root@XKWB5705 /]# rsync --delete-before -a -H -v --progress --stats /varOLD/haha.txt /aniya/usr.tar.gz
building file list ...
1 file to consider
hahah
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)


Number of files: 1
Number of files transferred: 1
Total file size: 0 bytes
Total transferred file size: 0 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 32
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 90
Total bytes received: 42


sent 90 bytes received 42 bytes 88.00 bytes/sec
total size is 0 speedup is 0.00


查看一下usr.tar.gz是否还存在,查看结果是存在的,但是包的大小变为了0
[root@XKWB5705 /]# ls -l /aniya/
total 0
-rw-r--r-- 1 root root 0 Sep 15 21:22 usr.tar.gz


-----------------------------------------------------------------------------------------------------------------------------------------------
现在清空/varOLD下的文件,使其变为空目录:
[root@XKWB5705 /]# rm -rvf /varOLD/hahah
removed `/varOLD/hahah'
[root@XKWB5705 /]# ls /varOLD/


我现在要做的是将/aniya/目录下的所有文件清空【即删除usr.tar.gz文件包】:
[root@XKWB5705 /]# rsync --delete-before -a -H -v --progress --stats /varOLD/ /aniya/
building file list ...
1 file to consider
deleting usr.tar.gz
./


Number of files: 1
Number of files transferred: 0
Total file size: 0 bytes
Total transferred file size: 0 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 28
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 50
Total bytes received: 26


sent 50 bytes received 26 bytes 152.00 bytes/sec
total size is 0 speedup is 0.00

/aniya/目录已经为空了
[root@XKWB5705 /]# ls /aniya/
[root@XKWB5705 /]# ls /aniya/

从以上结果可以得知:

当SRC和DEST文件性质不一致时将会报错
当SRC和DEST性质都为文件【f】时,意思是清空文件内容而不是删除文件
当SRC和DEST性质都为目录【d】时,意思是删除该目录下的所有文件,使其变为空目录

最重要的是,它的处理速度相当快,处理几个G的文件也就是秒级的事
最核心的内容是:rsync实际上用的就是替换原理


来自 https://www.iteye.com/blog/webcenterol-1232105



昨天遇到一个问题,在Linux中有一个文件夹里面含有大量的Cache文件(夹),数量级可能在百万级别,使用rm -rf ./* 删除时间慢到不可接受。Google了一下,查到了一种方法,试用了下确实比单纯使用rm快了一个数量级。

方法见下:

1)首先建立一个空白文件夹。

mkdir /tmp/www.111cn.net

2)之后使用以下语句即可快速的删除文件。

rsync --delete-before -d /tmp/www.111cn.net/ /the/folder/you/want/delete/

原文中说不要忘记两个文件夹后的“/”

3)一杯咖啡过后,就Ok了。

更多详细内容请查看:http://www.111cn.net/sys/linux/56624.htm

来自 https://www.cnblogs.com/alibai/p/3506652.html


普通分类: