Jak przeskoczyć 755 we wszystkich katalogach, ale nie ma pliku (rekurencyjnie)?
I odwrotnie: jak chmod tylko pliki (rekurencyjnie), ale nie ma katalogu?
permissions
chmod
Olivier Lalonde
źródło
źródło
Odpowiedzi:
Aby rekurencyjnie nadać katalogom uprawnienia do odczytu i wykonywania:
Aby rekurencyjnie nadać plikom uprawnienia do odczytu:
Lub, jeśli istnieje wiele obiektów do przetworzenia:
Lub, aby ograniczyć
chmod
odradzanie:źródło
-bash: /bin/chmod: Argument list too long
. Ostatnie polecenie działa z wieloma plikami, ale podczas korzystania zsudo
nich należy uważać, aby umieścić je przed xargs zamiast chmod:find /path/to/base/dir -type d -print0 | sudo xargs -0 chmod 755
dir
zostanie również ustawiona wartość 755.chmod ... $(find /path/to/base/dir -type ...)
kończy się niepowodzeniem dla nazw plików ze spacjami w nazwie.find /path/to/base/dir -type d -exec chmod 755 {} \;
(find /path/to/base/dir -type f -exec chmod 644 {} \;
).Typowym powodem tego rodzaju rzeczy jest ustawienie katalogów na 755, a plików na 644. W tym przypadku jest nieco szybszy sposób niż w
find
przykładzie Nik :Znaczenie:
-R
= rekurencyjnie;u+rwX
= Użytkownicy mogą czytać, pisać i wykonywać;go+rX
= grupa i inni mogą czytać i wykonywać;go-w
= grupa i inni nie mogą pisaćNależy tutaj zauważyć, że wielkie litery
X
działają inaczej niż małe literyx
. W instrukcji możemy przeczytać:Innymi słowy, chmod u + X na pliku nie ustawi bitu wykonania; a g + X ustawi to tylko, jeśli jest już ustawione dla użytkownika.
źródło
chmod -R 777
ponieważ+X
opcja nie zresetuje istniejących bitów wykonania plików. Użycie -x spowoduje zresetowanie katalogów i zapobiegnie zejściu do nich.X
, jak wyjaśniono w komentarzach.go+rX,go-w
->go=rX
prawda?chmod u-x,u+X
w kombinacji itp., Aby usunąć bity wykonania dla plików, ale dodać je do katalogów.Jeśli chcesz się upewnić, że pliki są ustawione na 644 i na ścieżce znajdują się pliki z flagą wykonania, najpierw musisz usunąć flagę wykonania. + X nie usuwa flagi wykonania z plików, które już ją mają.
Przykład:
Aktualizacja: wydaje się, że kończy się to niepowodzeniem, ponieważ pierwsza zmiana (ugo-x) powoduje, że katalog jest niewykonalny, więc wszystkie pliki pod nim nie są zmieniane.
źródło
chmod -R ugo-x path
, może to być problem. Ale pełne polecenie wykonachmod u+rwX
każdy katalog przed próbą zejścia do niego.) Uważam jednak, żechmod R u=rw,go=r,a+X path
to wystarczy - i jest krótsze.Postanowiłem napisać do tego mały skrypt.
Rekurencyjny skrypt chmod dla katalogów i / lub plików - Gist :
chmodr.sh
Zasadniczo robi rekurencyjny chmod, ale zapewnia także trochę elastyczności opcjom wiersza poleceń (ustawia uprawnienia do katalogu i / lub plików lub wyklucza oba, automatycznie resetuje wszystko do 755-644). Sprawdza także kilka scenariuszy błędów.
Pisałem również o tym na moim blogu .
źródło
Aby rekurencyjnie nadać katalogom uprawnienia do odczytu i wykonywania:
Aby rekurencyjnie nadać plikom uprawnienia do odczytu:
Lepiej późno niż nigdy nie pozwól mi zaktualizować odpowiedzi Nik po stronie poprawności. Moje rozwiązanie jest wolniejsze, ale działa z dowolną liczbą plików, z dowolnymi symbolami w nazwach plików, i możesz normalnie uruchamiać go z sudo (ale uważaj, że sudo może odkryć różne pliki).
źródło
Wypróbuj ten skrypt Pythona; nie wymaga odradzania procesów i wykonuje tylko dwa wywołania systemowe na plik. Oprócz implementacji w C, będzie to prawdopodobnie najszybszy sposób na zrobienie tego (potrzebowałem go, aby naprawić system plików zawierający 15 milionów plików, które zostały ustawione na 777)
W moim przypadku wymagana była próba / catch wokół ostatniego chmod, ponieważ chmodding niektórych plików specjalnych nie powiodło się.
źródło
Możesz także użyć
tree
:a jeśli chcesz również wyświetlić folder, dodaj echo
źródło
xargs
problemach. Pojedyncze cytaty w nazwach plików same w sobie stanowią problem dla wielu poleceń i skryptów, dlatego wymieniłem wszystkie pliki zawierające pojedyncze cytaty i usunąłem je (mam na myśli cytaty)Możesz użyć następującego skryptu bash jako przykładu. Pamiętaj, aby nadać mu uprawnienia do wykonywania (755). Wystarczy użyć ./autochmod.sh dla bieżącego katalogu lub ./autochmod.sh <katalog>, aby określić inny katalog.
źródło
$1
nie ma wartości null, ale nie jest nazwą katalogu (np. Literówka),dir
zostaje ustawiony na.
brak wiadomości. (2)$1
powinno być"$1"
i$dir
powinno być"$dir"
. (3) Nie musisz mówić"./"
;"."
jest w porządku (i ściśle mówiąc, nie potrzebujesz tutaj cytatów). (4) To nie jest rozwiązanie rekurencyjne. (5) W moim systemiels -l … | awk '{ print $8 }'
pobiera czasy modyfikacji plików. Musisz{ print $9 }
uzyskać pierwsze słowo nazwy pliku. I nawet wtedy (6) nie obsługuje nazw plików z białą spacją. …chmod
sam przejdzie na 644, przez co sam się nie wykona !