rekurencyjnie zmieniać uprawnienia do plików, ale nie katalogi?

13

Robiłem masową rekurencyjną zmianę uprawnień niektórych plików, które migrowałem do systemu unix. Zmieniłem je na ug + rw, ale potem okazało się, że nie mogę przejść do podkatalogów. Przejrzałem stronę podręcznika użytkownika chmodi nie znalazłem żadnego wyjaśnienia dla wykluczania katalogów, więc poszukałem trochę google i zauważyłem, że ludzie zwykli findrekurencyjnie zmieniać uprawnienia do katalogów, aby „wykonywać” dla użytkownika i grupy. Zrobiłem to, a potem mogłem je zobaczyć.

Wydawało mi się jednak, że powinienem być w stanie to znaleźć chmod- rekurencyjnie zmieniać pliki do odczytu / zapisu, ale nie uniemożliwiać dostępu do katalogów. Czy zrobiłem to „we właściwy sposób”, czy jest to prostszy sposób?

użytkownik394
źródło

Odpowiedzi:

12

Lepszym rozwiązaniem powinno być

chmod -R ug=rwX,o=rX /path

gdzie Xoznacza kapitał : ustaw bit wykonania jeśli

plik jest katalogiem lub ma już uprawnienia do wykonywania dla niektórych użytkowników

(cytowany ze chmodstrony podręcznika man).

Lub też, jeśli chcesz użyć find

find /path \( -type f -exec chmod ug=rw,o=r   {} + \) -o \
           \( -type d -exec chmod ug=rwx,o=rx {} + \)
enzotib
źródło
Użyłem szeroko otwartej dla wszystkich wersji tego polecenia na moim dysku twardym USB: chmod -v -R ugo = rwX / path Dzięki!
Koleś
Najwyraźniej nie ma innej możliwości bez findustawienia wszystkich uprawnień do plików na 600, a wszystkich uprawnień do katalogu na 700. (Przybyłem tutaj przez moje googlowania na ten temat.) Jeśli można to zrobić za pomocą jednego chmod -Rpolecenia, możesz mnie poprawić.
Wildcard
@Wildcard: niezupełnie, polecenie chmod -R u=rwX,go= /pathrobi prawie to, co chcesz: ustawia wszystkie katalogi na 700, a wszystkie pliki na 600 lub 700, w zależności od tego, czy bit wykonawczy jest już ustawiony, czy nie, i myślę, że jest to właściwe .
enzotib
1
@enzotib, tak - prawie, ale nie do końca. W moim przypadku chcę wyłączyć bit wykonania dla wszystkich plików (ale oczywiście nie katalogów) bez względu na to, czy są to skrypty, pliki binarne czy cokolwiek innego. Więc po findkomendzie napisałeś był bardzo pomocny jako szablon. :)
Wildcard
@Wildcard co z usunięciem najpierw bitu wykonawczego, rekurencyjnie, a następnie dodaniem go z powrotem tylko do katalogów za pomocą powyższego polecenia?
Michael
3

Korzystanie z funkcji wyszukiwania jest „właściwą” i jedyną metodą programową, chociaż istnieją odmiany:

find . -type f -exec chmod ug+rw {} +  # "+" may not be on all systems

lub

find . -type f -print0 | xargs -r0 chmod ug+rw  # similar to the -exec + functionality

lub najwolniejszy:

find . -type f -exec chmod ug+rw {} \;  # in case xargs is not installed

Każdy z nich wybiera plik (nie katalog, nie dowiązanie symboliczne) i stosuje na nim chmodpolecenie. Pierwsze dwa zmniejszają liczbę wywołań chmod, dodając plik na końcu wewnętrznego wiersza poleceń za każdym razem, aż zostanie osiągnięte maksimum (często 10), a następnie wywołuje polecenie i rozpoczyna odbudowę nowego polecenia. Ostatnia instrukcja odradza nowy proces dla każdego pliku, więc jest mniej wydajna.

Arcege
źródło