Kiedy podłączam pamięć USB (FAT) do komputera Mac lub Ubuntu, wszystkie pliki mają ustawione bity wykonywalne. Jak po skopiowaniu struktury katalogów na dysk twardy mogę rekurencyjnie usunąć bity wykonywalne tylko z plików i zachować je w katalogach?
73
Odpowiedzi:
W przypadku GNU
chmod
(na Ubuntu) wariant pojedynczego polecenia (począwszy od bieżącego katalogu):Wyjaśnienie:
-R
- działają rekurencyjnie-x
- usuń flagi wykonywalne dla wszystkich użytkowników+X
- ustaw flagi wykonywalne dla wszystkich użytkowników, jeśli jest to katalogW tym przypadku kapitał
X
dotyczy tylko katalogów, ponieważ wszystkie flagi wykonywalne zostały usunięte przez-x
. W przeciwnym razie+X
ustawia flagi wykonywalne, jeśli flaga została pierwotnie ustawiona dla dowolnego użytkownika, grupy lub innych osób.W BSD
chmod
(który jest obecny w Mac OS X) musisz to zrobić osobno za pomocą dwóch poleceń:(Jeśli chcesz również dołączyć ukryte pliki do głównego katalogu, prawdopodobnie musisz zmienić * na. (Punkt), ale nie jest to testowane).
źródło
chmod -R a-x+X *
umask
nie zezwalaszx
na wszystkie uprawnienia. Używasz domyślnejumask
lub zmieniłeś ją? Czy możesz wysłać wynikumask
polecenia? Oprócz twojego rozwiązania istnieje również taka możliwość:chmod -R a-x,+X *
która ustalix
pozwolenie według twojegoumask
. Zaktualizuję odpowiedź, ale najpierw chciałbym sprawdzić zachowanie w BSD / Mac OS X.find
wariant w poniższej odpowiedzi ze względu na styl łączenia prostych narzędzi, które wykonują One Thing Well..
zamiast,*
jeśli chcesz, aby to dotyczyło wszystkich plikówJeśli najpierw wpiszesz właściwą ścieżkę:
lub
Find znajduje wszystkie ścieżki typu „f” (co oznacza zwykły plik) na ścieżce. a następnie wywołuje chmod -x na każdym pliku. {} Zostaje zastąpione nazwą pliku i \; kończy polecenie chmod.
źródło
find
to obsługuje, użyj-exec ... \+
zamiast-exec ... \;
- będzie wymagało mniejfork
+exec
s. Jeśli nie, użyjfind ... -print0 | xargs -0 ...
.find . -type f -perm +111 -exec chmod -x {} \;
find
wspierasz-print0
, jestem prawie pewien, że będzie również obsługiwał-exec
W systemach Linux i Unix w oknie terminala lub w systemie Mac OS X użyj tego w Terminal.app:
źródło
Ten
chmod -x+X
sposób również nie działał dla mnie na Ubuntu, dlatego napisałem ten minimalny skrypt Pythona:Jeśli mogą być jakieś wymyślne dodatkowe rzeczy, takie jak gniazda w twoim systemie plików, możesz otoczyć ostatni chmod try / catch.
źródło