Chmod rekurencyjnie

249

Mam archiwum, które jest archiwizowane przez inną osobę i chcę automatycznie, po pobraniu, zmienić gałąź systemu plików w rozpakowanych plikach, aby uzyskać dostęp do odczytu. (Nie mogę zmienić sposobu tworzenia archiwum).

Przejrzałem ten wątek: chmod: Jak rekurencyjnie dodawać uprawnienia do wykonywania tylko do plików, które już mają uprawnienia do wykonywania, jak do niektórych innych, ale bez radości.

Początkowo katalogi zawierają wiele, ale wszystkie nieprawidłowe flagi, mogą wyglądać następująco:

drwx------
d---r-x---
drwxrwxr-x
dr--r-xr--

To tylko kilka, które do tej pory odkryłem, ale może być ich więcej.

findbłędy, gdy próbuje zajrzeć do katalogu bez xuprawnień, a więc nie przekazuje go do chmod. Do tej pory robiłem ręcznie zmienić uprawnienia do katalogu nadrzędnego, a następnie przejść do katalogów podrzędnych i zrobić to samo dla nich i tak dalej. Ale to dużo pracy rąk. Czy nie ma sposobu, aby to zrobić automatycznie?

Tj jak teraz to robię:

robić:

$ chmod -R +x
$ chmod -R +r

dopóki nie dostanę błędów

$ find -type f -exec chmod -x {} +

Ale musi być lepszy sposób.

Społeczność
źródło
3
-r nie to samo co -R
PJ Brunet
Inna uwaga, jeśli chcesz powiedzieć, że wszystkie uprawnienia grupowe są zgodne z uprawnieniami właściciela (wydaje się, że mniej prawdopodobne jest załatwienie wszystkiego w IMO), to jest całkowicie możliwe do serverfault.com/a/284478/210994
ThorSummoner

Odpowiedzi:

131

Potrzebujesz dostępu do odczytu, oprócz dostępu do wykonania, aby wyświetlić katalog. Jeśli masz tylko dostęp do wykonania, możesz znaleźć nazwy wpisów w katalogu, ale nie ma innych informacji (nawet typów, więc nie wiesz, które wpisy są podkatalogami). To działa dla mnie:

find . -type d -exec chmod +rx {} \;
Fred Foo
źródło
2
Jaka jest różnica pomiędzy '\;' i „+”, który był używany przez PO na końcu polecenia?
kon psych
1
@konpsych Najwyraźniej +buduje wiersz poleceń w inny sposób. Tak naprawdę nie byłem tego świadomy; \;jest zwykłym sposobem, z jednym poleceniem na plik pasującym do wyszukiwania.
Fred Foo,
Nie działa, jeśli niektóre pliki mają spacje w nazwie
Soonts
3
@Soonts Następnie "{}"zamiast tego {}naprawić.
user4642212
Uruchomiłem to pod podsystemem Linux na Windows 10 i miało to odwrotny skutek. Większość uprawnień do plików zostało usuniętych.
Max Candocia,
176

Możesz użyć chmod z Xliterą trybu (wielkie X), aby ustawić flagę wykonywalną tylko dla katalogów.

W poniższym przykładzie flaga wykonywalna jest wyczyszczona, a następnie rekurencyjnie ustawiona dla wszystkich katalogów:

~$ mkdir foo
~$ mkdir foo/bar
~$ mkdir foo/baz
~$ touch foo/x
~$ touch foo/y

~$ chmod -R go-X foo 
~$ ls -l foo
total 8
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 bar
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

~$ chmod -R go+X foo 
~$ ls -l foo
total 8
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 bar
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

Trochę wyjaśnienia:

  • chmod -x foo- wyczyść flagę eXecutable dlafoo
  • chmod +x foo- ustaw flagę eXecutable dlafoo
  • chmod go+x foo- tak samo jak powyżej, ale ustaw flagę tylko dla grupy i innych użytkowników, nie dotykaj uprawnień użytkownika (właściciela)
  • chmod go+X foo - tak samo jak powyżej, ale dotyczy tylko katalogów, nie dotykaj plików
  • chmod -R go+X foo- tak samo jak powyżej, ale zrób to Rekurencyjnie dla wszystkich podkatalogówfoo
Dmitry
źródło
80

Spróbuj zmienić wszystkie persymisje jednocześnie:

chmod -R +xr
choroba
źródło
Spowoduje to również nadanie uprawnień do wykonywania wszystkim non-katalogom.
Fred Foo
1
Tak. To po prostu zastępuje pierwszy krok iteracji. Nadal musisz biegać find -type f -exec chmod -x {} +później.
choroba
50

Aby wszystko zapisywać przez właściciela, przeczytaj / wykonaj przez grupę, a świat wykonalny:

chmod -R 0755

Aby wszystko było szeroko otwarte:

chmod -R 0777
Tim Jensen
źródło
12
Dodaj bieżącą lokalizację folderu:chmod -R 0777 .
Danijel
18

Dodawanie uprawnień wykonywalnych rekurencyjnie do wszystkich plików (nie folderów) w bieżącym folderze z shrozszerzeniem:

find . -name '*.sh' -type f | xargs chmod +x

* Zwróć uwagę na potok ( |)

AlikElzin-kilaka
źródło
2

Daj 0777 wszystkim plikom i katalogom, zaczynając od bieżącej ścieżki:

chmod -R 0777 ./

Anthony Vinay
źródło