30/09/2018, 16:32
Sao dùng rsync -a --delete lại xóa directory nhanh vậy nhỉ?
Mới google ra thấy cái mẹo này để empty một directory rất nhanh. Nhưng mình không hiểu sao nó lại nhanh đến thế.
mkdir empty_dir
rsync -a --delete empty_dir/ yourdirectory/
Nguồn: http://unix.stackexchange.com/questions/37329/efficiently-delete-large-directory-containing-thousands-of-files
Update: Nhanh hơn so với rm -rf dir
trong trường hợp dir
có nhiều file nhỏ
Bài liên quan
Nhanh so với cái gì vậy Đạt?
Nếu Đạt dùng GNU find, thử:
Hoặc:
Nhanh so với
rm -rf
trong trường hợp director muốn xóa có nhiều file nhỏHình như cái này cũng nhanh, thấy trong link ở Post 1 cũng có nói về
find -delete
mà Đạt chưa thử.rm -rf
hayrsync --delete
đều gọiunlink()
system call với mỗi file. Khi directory có nhiều files,rm
sẽ chậm hơn vì nó phải tự build directory tree để xử lý file (thường là btree).rsync
thì chỉ quân tâm đến directory tree ở source, duplicate sang destination.Vậy lý do là rm phải build
directory tree
, mà sao phải build nhỉ, gặp cái nào thì bụp cái đó thôi.Nếu vậy nó cũng phải
unlink
destination file chứ?Nếu cứ gặp thằng nào bụp thằng đó, nhỡ cứ bụp xong lại có thằng tạo ra, hay có thằng nào đó tương kế tựu kế làm cái symlink sang directory khác thì…toi. Nếu Đạt dùng
strace
Đạt sẽ thấy mỗi lân remove một file xong thìrm
sẽ lại dùng syscallnewfstatat
.Cả
rsync
vàrm
đều phảiunlink
tất cả các file trong thư mục, nhưngrsync
không phải build directory tree nhưrm
, nó chỉ việc dùng syscall và bắt kernel làm điều này.Nếu Đạt để ý thì thấy cả
rm
vàrsync
đều remove files theo dạngDepth First Search
, nếu có file A và C, directory B thì A sẽ bị remove trước, rồi B và tất cả các con của nó, rồi mới đến C.