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ỏ

2 Likes

Nhanh so với cái gì vậy Đạt?

Nếu Đạt dùng GNU find, thử:

cd /path/to/yourdirectory
find -delete

Hoặc:

cd /path/to/yourdirectory
perl -e 'unlink for <*>'
1 Like

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 hay rsync --delete đều gọi unlink() 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 syscall newfstatat.

Cả rsyncrm đều phải unlink tất cả các file trong thư mục, nhưng rsync 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ả rmrsync đều remove files theo dạng Depth 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.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?