Câu trả lời:
Nó có thể được thực hiện với dòng shell sau:
D1=foo; D2=foo2; for entry in $(find $D1 -exec stat -f "%N:%Mp%Lp" {} \;); do $(echo $entry | sed 's#'$D1'#'$D2'#' | awk -F: '{printf ("chmod %s %s\n", $2, $1)}') ; done
chỉ cần đặt đúng giá trị cho các biến D1 và D2, trỏ chúng vào thư mục nguồn và đích, chạy và các thư mục sẽ có quyền đồng bộ hóa.
Tôi vừa học được một cách mới và đơn giản để thực hiện điều này:
getfacl -R /path/to/source > /root/perms.acl
Điều này sẽ tạo ra một danh sách với tất cả các quyền và quyền sở hữu.
Sau đó đi đến một cấp trên đích và khôi phục quyền với
setfacl --restore=/root/perms.acl
Lý do bạn phải ở một cấp trên là tất cả các đường dẫn trong perms.acl đều tương đối.
Nên làm tận gốc.
getfacl
và setfacl
không nhất thiết phải có mặt trên tất cả các hệ thống.
.ac
trong lệnh đầu tiên và .acl
trong thứ hai?
Nếu bạn có nguồn và mệnh, bạn có thể đồng bộ hóa quyền của mình với
rsync -ar --perms source/ dest
Nó sẽ không chuyển dữ liệu, chỉ là quyền ...
-r
và --perms
là cần thiết, nhưng điều này vẫn perms đồng bộ nếu họ là điều duy nhất mà là khác nhau (đó là những gì bạn nói trong câu hỏi, nếu cây không thực sự giống hệt bạn không nên nói rằng họ).
Một điều bạn có thể làm là sử dụng lệnh find để xây dựng một tập lệnh với các lệnh bạn cần để sao chép các quyền. Dưới đây là một ví dụ nhanh, bạn có thể làm được nhiều hơn với các tùy chọn printf khác nhau, bao gồm cả chủ sở hữu, id nhóm, v.v.
$ find /var/log -type d -printf "chmod %m %p \n" > reset_perms
$ cat reset_perms
chmod 755 /var/log
chmod 755 /var/log/apt
chmod 750 /var/log/apache2
chmod 755 /var/log/fsck
chmod 755 /var/log/gdm
chmod 755 /var/log/cups
chmod 2750 /var/log/exim4
...
Hai lối:
(trong trường hợp sau / dst phải tồn tại)
Chỉnh sửa: xin lỗi, tôi đọc sai. Không phải những gì bạn yêu cầu.
Tôi nghĩ rằng tôi sẽ viết một kịch bản perl để làm điều đó. Cái gì đó như:
#!/usr/bin/perl -nw
my $dir = $_;
my $mode = stat($dir)[2];
my $pathfix = "/some/path/to/fix/";
chmod $mode, $pathfix . $dir;
Sau đó làm một cái gì đó như thế này:
cd /some/old/orig/path/ ; find . -type d | perlscript
Tôi đã viết nó ra khỏi đỉnh đầu của tôi, và nó đã không được thử nghiệm; Vì vậy, hãy kiểm tra nó trước khi bạn để nó chạy tràn lan. Điều này chỉ sửa các quyền trên các thư mục tồn tại; nó sẽ không thay đổi quyền trên các tập tin, cũng sẽ không tạo các thư mục bị thiếu.