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ỏ

LE Manh Cuong viết 18:47 ngày 30/09/2018

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 <*>'
Nguyễn Minh Dũng viết 18:36 ngày 30/09/2018

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

Nhanh so với rm -rf trong trường hợp director muốn xóa có nhiều file nhỏ

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

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ử.

LE Manh Cuong viết 18:41 ngày 30/09/2018

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.

Nguyễn Minh Dũng viết 18:35 ngày 30/09/2018

rm sẽ chậm hơn vì nó phải tự build directory tree để xử lý file

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.

rsync thì chỉ quân tâm đến directory tree ở source, duplicate sang destination.

Nếu vậy nó cũng phải unlink destination file chứ?

LE Manh Cuong viết 18:36 ngày 30/09/2018

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.

Bài liên quan
0