Chcę ustawić uprawnienia 755 na wszystkie pliki i podkatalogi w określonym katalogu, ale chcę uruchomić chmod 755 tylko dla tych komponentów, które nie mają uprawnień 755.
find /main_directory/ -exec chmod 755 {} \;
Jeśli find
polecenie zwróci długą listę, zajmie to dużo czasu. Wiem, że mogę użyć polecenia stat, aby sprawdzić uprawnienia na poziomie pliku ósemkowego dla każdego komponentu, a następnie użyć if-else, aby przełączyć uprawnienie do pliku, ale czy istnieje podejście z pojedynczą linią find
i xargs
najpierw sprawdzić, jakie uprawnienia ma plik / katalog , a następnie użyj, chmod
aby zmienić na 755, jeśli jest ustawiony na coś innego.
command-line
find
chmod
Kumarjit Ghosh
źródło
źródło
u+rw,go+r,go-w,ugo+X
- zwróć uwagę na stolicę.Odpowiedzi:
Jeśli chcesz zmienić uprawnienia
755
zarówno do plików, jak i katalogów, nie ma realnej korzyści z używaniafind
(przynajmniej z punktu widzenia wydajności), a możesz po prostu to zrobićJeśli naprawdę chcesz użyć,
find
aby uniknąć zmiany uprawnień do rzeczy, które już mają755
uprawnienia (aby uniknąć aktualizacji ich sygnatury czasowej ctime), powinieneś również przetestować bieżące uprawnienia dla każdego katalogu i pliku:-exec ... {} +
Będzie zebrać jak wiele ścieżek, jak to możliwe, że przejdzie! -perm 0755
testu i wykonaćchmod
na nich wszystkich naraz.Zwykle chciałoby się zmieniać uprawnienia do plików i katalogów osobno, aby nie wszystkie pliki były wykonywalne:
źródło
+
zamiast;
robi tutaj dużą różnicę.Jak
find
już otrzymałeś-exec ... +
składnię, nie ma większego sensu w użyciuxargs
, ale kiedy o nią prosisz:źródło
-0
(w połączeniu z-print0
in find; który jest rozszerzeniem GNU) może być dość problematyczny z punktu widzenia bezpieczeństwa, jeśli potencjalny atakujący może utworzyć nazwy plików zawierające białe spacje lub inne znaki specjalne. Lepiej więc trzymaj się,-exec
kiedy możeszxargs
(po prostu użyj-exec
), a jeśli go użyjesz, powinieneś użyć-print0
/-0
jak mówi Matija.