Jak mogę zmienić wszystkie pliki należące do jednego użytkownika na innego użytkownika?

39

Szukam polecenia systemu Linux, które może zmienić własność wszystkich plików należących do danego użytkownika, najlepiej w katalogu docelowym, na innego określonego użytkownika.

Moje polecenie marzeń wyglądałoby mniej więcej tak ...

chuser -R --olduser tom --newuser jerry

lub

chuser -R --olduser 1066 --newuser 1492

To jest mój scenariusz ... Mam plik kopii zapasowej (.tgz) z zachowanymi informacjami o użytkownikach i grupach. Został pobrany z serwera WWW z Apache i MySQL. Pliki w kopii zapasowej pochodzą z całego systemu i zawierają pliki kilku różnych użytkowników i kilku kont typu systemowego. Kluczowe jest, aby po przywróceniu na nowym serwerze ustawienia nie zostały utracone. Problem polega na tym, że użytkownicy na komputerze przywracają pliki, aby nie pasowały do ​​tych z pliku kopii zapasowej. Na przykład obie maszyny miały użytkownika MySQL, ale mają różne identyfikatory użytkowników i istnieje kilka identyfikatorów użytkowników na obu komputerach należących do różnych użytkowników. Oznacza to, że nie ma sposobu na zsynchronizowanie użytkowników na nowym komputerze z użytkownikami na starym komputerze.

Mogę znaleźć wszystkie pliki użytkowników za pomocą polecenia find w ten sposób ...

find /decompressed-backup-dir -uid 1050

lub

find /decompressed-backup-dir -user tom

Jeśli, jak podejrzewam, nie ma sposobu, aby zrobić to, co chcę za pomocą jednego polecenia, to może istnieje sposób na przekazanie wyników polecenia find do innego polecenia, aby obsłużyć zmianę własności?

Mógłbym to zrobić za pomocą skryptu PHP, ale w kopii zapasowej są 4 GB i dziesiątki tysięcy plików, więc nie chcę używać PHP ani Perla, ale byłbym zadowolony ze skryptu powłoki, który mógłby to obsłużyć.

Nocna sowa
źródło

Odpowiedzi:

30

Coś jak

find /decompressed-backup-dir -uid 1050 -exec chown newuser:newgroup {} +
Ben Voigt
źródło
1
zamiast -uidużyłem-user
alexandre1985
65

Myślę, że flaga --from na komendzie chown jest prawdopodobnie najłatwiejszym sposobem.

chown --from=oldguy newguy * -R
SiteKickr
źródło
3
Najlepsze rozwiązanie, nie trzeba go kochać
Tobias Hagenbeek
2
Optymalne rozwiązanie
Karl Forner,
1
w OS X możesz to zrobić za pomocą brew install coreutilsi gchown.
jomo
To jest poprawna i najlepsza odpowiedź.
George M,
Potwierdzam, że powinna być oznaczona jako najlepsza odpowiedź.
Soullivaneuh
7

Dodając do odpowiedzi przez SiteKickr , chgrpnie ma --fromargumentu, ale można osiągnąć to samo z chownpomijając użytkownika.

Przykład:

chown -R --from=:currentgroup :newgroup /some/directory
TheBigB
źródło
6

Możesz użyć find, jak napisał ktoś inny, do zrobienia chown.

Jednak nie musisz tego robić, ponieważ tarzajmie się Tobą.

Na przykład, jeśli utworzysz plik, tarw machine Aktórym tomznajduje się użytkownik, uid 500a następnie untarplik, w machine Bktórym tomznajduje się użytkownik uid 505, tarzrobi właściwą rzecz i utworzy pliki należące do uid 505.

Ciclamino
źródło
Ciekawe smakołyki, nie zdawałem sobie z tego sprawy. Zatem tar nie tylko przechowuje identyfikator użytkownika, ale także nazwę związaną z identyfikatorem użytkownika.
Nicholi,
3
Oryginalny format tar przechowywał tylko informacje liczbowe. Format UStar, wprowadzony przez POSIX pod koniec lat 80., dodaje nazwy. Więc właściwie każda smoła, którą spotkasz w dzisiejszych czasach, działa dobrze.
Ciclamino
1

Odpowiedź ustawia zarówno użytkowników i grup:

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

ale jeśli chcesz zmienić TYLKO grupę plików, która należy do jakiegoś użytkownika, nie możesz używać chown(o ile wiem), ale zamiast tego użyj chgrp:

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

i aby zmienić TYLKO grupę plików, która należy do jakiejś grupy, musisz użyć np .:

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

Żeby dodać wiedzę.

Timo Kähkönen
źródło
1
W rzeczywistości możesz po prostu pominąć tę newuserczęść. Strona podręcznika mówi: „Jeśli podano dwukropek i grupę, ale pominięto właściciela, zmieniana jest tylko grupa plików; w tym przypadku chownpełni tę samą funkcję, co chgrp”.
Ben Voigt
0

Jeśli chcesz rekurencyjnie odwzorować stare / nowe identyfikatory własności, które dotyczą tego samego /etc/passwdużytkownika ,

(co może się zdarzyć po wprowadzeniu LDAP na serwerze i /etc/passwdzduplikowaniu wpisów dla każdego użytkownika i grupy),

możesz użyć tego skryptu, który napisałem: https://gist.github.com/siers/ded0a4158c900495f04c3ad965f4a544

Sam tworzy mapowanie. Interfejs programu znajduje się niestety w kodzie. Dodaj kilka instrukcji debugowania, jeśli chcesz sprawdzić, jak to działa. Ale to właściwie uwielbiany chown z mapowaniem utworzonym z duplikatów w/etc/passwd . Jeśli byłoby to kiedykolwiek przydatne dla kogoś, byłoby naprawdę fajnie. :)

galva
źródło
-2

Możesz użyć chown - R /directory/file

To polecenie zmieni uprawnienia dla wszystkich wystąpień katalogu chown - R /directory

Mansur
źródło