Làm cách nào tôi có thể thay đổi tất cả các tệp thuộc về một người dùng này sang một người dùng khác?


39

Tôi đang tìm kiếm một lệnh Linux có thể thay đổi quyền sở hữu tất cả các tệp thuộc về một người dùng nhất định, tốt nhất là trong một thư mục được nhắm mục tiêu, cho một người dùng được chỉ định khác.

Lệnh mơ ước của tôi sẽ trông giống như thế này ...

chuser -R --olduser tom --newuser jerry

hoặc là

chuser -R --olduser 1066 --newuser 1492

Đây là kịch bản của tôi ... Tôi có một tệp sao lưu (.tgz) với thông tin người dùng và nhóm được lưu giữ trong đó. Nó được lấy từ một máy chủ web chạy Apache và MySQL. Các tệp trong bản sao lưu là từ khắp hệ thống và chứa các tệp từ một số người dùng khác nhau và một số tài khoản loại hệ thống và đó là chìa khóa mà khi được khôi phục trên máy chủ mới, các cài đặt sẽ không bị mất. Vấn đề là người dùng trên máy các tệp đang được khôi phục để không khớp với các tệp trong tệp sao lưu. Chẳng hạn, cả hai máy đều có người dùng MySQL nhưng họ có id người dùng khác nhau và có một số id người dùng tồn tại trên cả hai máy thuộc về người dùng khác nhau. Điều này có nghĩa là không có cách nào để đồng bộ hóa người dùng trên máy mới với máy trên máy cũ.

Tôi có thể tìm thấy tất cả các tệp người dùng bằng lệnh find như thế này ...

find /decompressed-backup-dir -uid 1050

hoặc là

find /decompressed-backup-dir -user tom

Nếu, như tôi nghi ngờ, không có cách nào để làm những gì tôi muốn với một lệnh duy nhất thì có lẽ có cách nào để chuyển kết quả của lệnh find sang lệnh khác để xử lý thay đổi quyền sở hữu?

Tôi có thể làm điều này với tập lệnh PHP nhưng có 4GB và hàng chục nghìn tệp trong bản sao lưu vì vậy tôi không muốn sử dụng PHP hoặc Perl nhưng tôi sẽ hài lòng với tập lệnh shell có thể xử lý nó.

Câu trả lời:


30

Cái gì đó như

find /decompressed-backup-dir -uid 1050 -exec chown newuser:newgroup {} +

1
thay vì -uidtôi đã sử dụng-user
alexandre1985

65

Tôi nghĩ rằng cờ - từ lệnh chown có lẽ là cách dễ nhất.

chown --from=oldguy newguy * -R

3
Giải pháp tốt nhất, không cần tìm tình yêu
Tobias Hagenbeek 16/07/14

2
Giải pháp tối ưu
Karl Forner

1
trên OS X bạn có thể làm điều này với brew install coreutilsgchown.
Jomo

Đây là câu trả lời đúng và tốt nhất.
George M

Tôi xác nhận, nó nên được đánh dấu là câu trả lời tốt nhất.
Soullivaneuh

7

Thêm vào câu trả lời của SiteKickr , chgrpkhông có --fromđối số, nhưng bạn có thể đạt được điều tương tự bằng chowncách bỏ qua người dùng.

Thí dụ:

chown -R --from=:currentgroup :newgroup /some/directory

6

Bạn có thể sử dụng find, như một số người khác đã đăng, để làm chown.

Tuy nhiên, bạn có thể không phải tarchăm sóc mọi thứ cho bạn.

Ví dụ, nếu bạn thực hiện một tartrên machine Anơi người dùng tomuid 500và sau đó untartập tin vào machine Bnơi người dùng tomuid 505, tarsẽ làm điều đúng và làm cho các tập tin thuộc sở hữu của uid 505.


Tidbit thú vị, tôi đã không nhận thức được điều này. Vì vậy, tar không chỉ lưu trữ uid mà còn là tên liên quan đến uid.
Nicholi

3
Các định dạng tar ban đầu chỉ lưu trữ thông tin số. Định dạng UStar, được giới thiệu bởi POSIX vào cuối những năm 80, thêm tên. Vì vậy, hầu như bất kỳ tar bạn gặp phải những ngày này làm điều đúng.
Ciclamino

1

Câu trả lời đặt cả người dùng và nhóm:

find /decompressed-backup-dir -uid 1050 -exec chown newuser:newgroup {} +

nhưng nếu bạn muốn thay đổi nhóm CHỈ thuộc về một số người dùng, bạn không thể sử dụng chown(theo như tôi biết), nhưng thay vào đó hãy sử dụng chgrp:

find /decompressed-backup-dir -uid 1050 -exec chgrp newgroup {} +

và để thay đổi nhóm CHỈ các tệp thuộc về một số nhóm bạn phải sử dụng, vd.:

find /decompressed-backup-dir -gid 400 -exec chgrp newgroup {} +

Chỉ để thêm kiến ​​thức.


1
Trên thực tế, bạn chỉ có thể bỏ qua newusermột phần. Trang Man nói: "Nếu dấu hai chấm và nhóm được đưa ra, nhưng chủ sở hữu bị bỏ qua, chỉ nhóm các tệp được thay đổi; trong trường hợp này, chownthực hiện chức năng tương tự như chgrp."
Ben Voigt

0

Nếu bạn cần ánh xạ đệ quy ID sở hữu cũ / mới giải quyết cho cùng một /etc/passwdngười dùng ,

(điều này có thể xảy ra sau khi bạn đã giới thiệu LDAP vào máy chủ và /etc/passwdcó các mục trùng lặp cho mỗi người dùng và nhóm),

bạn có thể sử dụng tập lệnh này tôi đã viết: https://gist.github.com/siers/ded0a4158c900495f04c3ad965f4a544

Nó tự tạo bản đồ. Giao diện của chương trình, thật không may, trong mã. Thêm một số câu lệnh gỡ lỗi nếu bạn cần điều tra làm thế nào nó làm gì. Nhưng đó là một chown vinh quang với một bản đồ được tạo từ các bản sao trong/etc/passwd . Nếu điều này là hữu ích cho bất cứ ai, điều đó sẽ thực sự tuyệt vời. :)


-2

Bạn có thể dùng chown - R /directory/file

Lệnh này sẽ thay đổi quyền cho tất cả các phiên bản của thư mục chown - R /directory

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.