当一个文件夹下面有海量的文件需要删除时,使用rm命令往往可能会遇到问题。
一个问题是删除速度慢,往往需要几分钟到几十分钟不等的时间才能完成操作;另一个问题是可能会有参数溢出的问题导致rm命令报错。
此时,可以使用rsync命令来执行删除操作,主要用到的参数是--delete。
比如,可以看到下面的例子中a文件夹下面有246803个文件。要删除这些文件,可以先建一个空文件夹b,然后用rsync命令让b文件夹与a文件夹进行同步。
ls | wc -l
246803
#rm命令报错
rm -f *
-bash: /usr/bin/rm: Argument list too long
#使用rsync命令
rsync -av --delete /tset/b/ /tset/a/
#使用一个空的文件夹与a同步,使用--delete参数删除只存在于目标目录、不存在于源目录的文件。
sent 43 bytes received 3,676,572 bytes 294,129.20 bytes/sec
total size is 0 speedup is 0.00
rsync :同步:增量拷贝,只传输变化过的数据
命令参数详解
rsync [选项...] 源目录 目标目录
- -n:测试同步过程,不做实际修改
- --delete:删除目标文件夹内多余的文档
- -a:归档模式,相当于-rlptgoD
- -v:显示详细操作信息
- -z:传输过程中启用压缩/解压
- --exclude 排除文件
--include 用来指定必须同步的文件模式
#同步时排除某些文件或目录 rsync -av --exclude='*.txt' source/ destination rsync -av --exclude '*.txt' source/ destination #上面命令排除了所有 TXT 文件。 #注意,rsync 会同步以“点”开头的隐藏文件,如果要排除隐藏文件,可以这样写--exclude=".*"。 #如果要排除某个目录里面的所有文件,但不希望排除目录本身,可以写成下面这样: rsync -av --exclude 'dir1/*' source/ destination #多个排除模式,可以用多个--exclude参数 rsync -av --exclude 'file1.txt' --exclude 'dir1/*' source/ destination rsync -av --exclude={'file1.txt','dir1/*'} source/ destination #如果排除模式很多,可以将它们写入一个文件,每个模式一行,然后用--exclude-from参数指定这个文件 rsync -av --exclude-from='exclude-file.txt' source/ destination
关于/的注意事项
- 不加/,源目录source会被完整的复制到目标目录destination下面,形成/destination/source 这样的目录结构
源目录source后面有/,则只是将source目录里面的内容完整的同步到destination目录下,而不同步source目录本身。
rsync -a source destination #destination目录下会有一个source文件夹 rsync -a source/ destination #destination目录下面会有source文件夹里面的内容,而没有source本身。
其他rsync命令
#模拟同步操作,显示将要发生的更改,但不实际执行。
rsync --dry-run source_dir destination_dir
#限制带宽使用率,以 KB/s 为单位,在同步过程中限制带宽使用率为 500 KB/s
rsync --bwlimit=500 source_dir destination_dir
#允许在中断后重新传输,同时显示实时进度
rsync --progress --partial source_dir destination_dir
#仅同步小于 100KB 的文件
rsync -a --max-size='100K' source_dir destination_dir
#仅同步大于 1MB 的文件
rsync -a --min-size='1M' source_dir destination_dir
#只同步文件夹,忽略文件
rsync -a --include='*/' --exclude='*' source_dir destination_dir
#将同步过程信息记录到指定的日志文件中
rsync -avzP --log-file='log.txt' source_dir destination_dir
#排除所有的 .txt 文件,并在目标目录中删除已排除的文件
rsync -a --exclude='*.txt' --delete-excluded source_dir destination_dir
评论