Rekursywny chmod: rw dla plików, rwx dla katalogów

28

Chcę chmoddużo plików i katalogów. Jak xwskazuje lista katalogów i wykonanie dla zwykłych plików, chciałbym ubiegać się rwo pliki i rwxkatalogi. Czy to możliwe, używając tylko chmodpolecenia?

Jeśli nie, jaki jest najwygodniejszy sposób?

Wykonanie takiej czynności chmod -R 770nie jest możliwe, ponieważ nie chcę, aby zwykłe pliki były wykonywalne.

Usunięte
źródło
1
Czy naprawdę chcesz mieć publiczne uprawnienia do zapisu plików i katalogów? Oznacza to, że nie obchodzi Cię, kto blokuje któryś z plików?
Jonathan Leffler,
Prawdziwe. Zmieniłem to powyżej.
Usunięte

Odpowiedzi:

19

Robię to czasami przy użyciu jednego findpolecenia. Brzydki, ale skuteczny.

find /p/a/t/h \( -type d -exec chmod 755 {} \; \) -o \( -type f -exec chmod 644 {} \; \)
baumgart
źródło
Czy nie trzeba cytować „{}”, na wypadek, gdyby ścieżki zawierały spacje? Lubię find . -type d -exec chmod -vc 755 "{}" \;(w tym -vcza opinie). (A może, aby to wyjaśnić, dodać również dwa niezależne polecenia do odpowiedzi?)
Arjan,
Nie, {} nie musi być cytowany (właśnie testowałem, aby być absolutnie pewnym). Kiedy find wstawia {} do polecenia, jest ono właściwie usuwane. Nie sprawdziłem wewnętrznego działania find, ale zakładam, że tworzy on tablicę argumentów do przekazania do exec () i strcpy () nazwę pliku w tablicy. Gdy chmod spojrzy na swoje argumenty, będzie wyglądał poprawnie.
baumgart
37

Użyj uprawnienia X ze strony man:

Bity wykonania / wyszukiwania, jeśli plik jest katalogiem lub którykolwiek z bitów wykonania / wyszukiwania jest ustawiony w oryginalnym (niezmodyfikowanym) trybie. Operacje z symbolem perm „X” mają znaczenie tylko w połączeniu z symbolem op „+” i są ignorowane we wszystkich innych przypadkach.

Wykonaj następujące czynności:

chmod -R a-x [directory]
chmod -R a+rwX [directory]

Usuwa to bit wykonawczy ze wszystkich plików i katalogów, a następnie dodaje uprawnienia do odczytu i zapisu do wszystkiego oraz wykonuje uprawnienia tylko do katalogów. (Żadne zwykłe pliki nie mają już bitu wykonania od pierwszego kroku.)

Ben S.
źródło
1
nie wymusi to trybu 666 na zwykłych plikach. nie usuwa bitu wykonywalnego dla zwykłych plików, jeśli już go ustawiono.
quack quixote
Więc w takim razie możesz zrobić to chmod -R a-x [directory]po chmod -R a+rwX [directory]?
jwaddell,
@jwaddel: To powinno działać. Usuwasz wszystkie bity wykonania, niezależnie od typu pliku / katalogu, a następnie dodajesz execute tylko do katalogów i zwykłych plików, które już mają bit wykonania (który jest teraz żaden).
Ben S
Gdy to zrobię a-x, katalog nie będzie dostępny. W rzeczywistości chmod kończy się niepowodzeniem z odmową uprawnień i nie usunie bitu wykonywalnego z plików w katalogu. Czy istnieje sposób, aby to zrobić bez rootowania?
avakar
14

Możesz także użyć findwraz z xargs:

find . -type f -print0 | xargs -0 chmod 666
find . -type d -print0 | xargs -0 chmod 777

gdzie -typeokreśla d irectory lub f Ile.

John T.
źródło
1
Czy xargs nie ma ograniczenia długości? To DUŻO plików i katalogów.
Usunięte
2
Najpierw tworzyłem katalogi, a potem pliki. W przeciwnym razie ryzykowałbyś pominięcie jakiegoś poddrzewa z powodu braku pozwolenia. Powinieneś również sprawdzić, czy lista jest sprawdzana przed lub po chmod, w przeciwnym razie, tak jak powyżej. I tak, powstrzymałbym się od używania xargs.
Stefano Borini,
1
xargsjest wystarczająco sprytny, aby przełamać długie wiersze poleceń do wielu wykonań. Sprawdź swoją stronę xargs i koniecznie sprawdź xargs --show-limits.
Mike