Wyodrębnij pliki i foldery z określonymi uprawnieniami

11

Pakuję folder z wieloma podfolderami i plikami w systemie Windows za pomocą 7zip, przesyłam do VPS, a następnie uruchamiam polecenie:

tar -xvzf file.tar.gz

wtedy wszystkie rozpakowane pliki i foldery mają uprawnienia 777. Jak mogę je uzyskać, aby foldery miały uprawnienia 755 i pliki 644?

Kaspar L. Palgi
źródło
Istnieje strona internetowa o nazwie „Command Line Fu”, która ma również wiele innych pomysłów.
djangofan

Odpowiedzi:

13

Jeśli pracujesz tar(1)jako zwykły użytkownik, zastosuje on umaskdomyślnie. Jeśli używasz tar(1)jako root, możesz podać --no-same-permissionsopcję wiersza polecenia, aby poprosić tar(1)o przestrzeganie umask.

Więc: uruchom to jako zwykły użytkownik:

umask 022
tar zxvf file.tar.gz

lub uruchom jako root:

umask 022
tar zxvf file.tar.gz --no-same-permissions

Może chcesz przykleić umask 022do swojej ~/.bashrc, ~/.bash_profilelub ~/.profile. (Szczegółowe bash(1)informacje na temat plików startowych można znaleźć na stronie podręcznika. To skomplikowane).

Szczegółowe informacje na umaskten temat można znaleźć na stronie podręcznika powłoki, na stronie umask(2)wywołania systemowego lub na stronie umask(1posix)narzędzia dostarczonej przez POSIX (jeśli jest już manpages-posixzainstalowany).

Sarnold
źródło
umask 022 tar zxvf file.tar.gz -> to prosi mnie o potwierdzenie każdego pliku osobno, jeśli chcę go wyodrębnić
Czy nadpisujesz przy tym istniejące pliki?
sarnold
6

Uruchom następujące polecenia w katalogu głównym katalogu, aby ustawić żądane uprawnienia dla katalogów i plików:

find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

Uważaj na przestrzeń między zamykającym nawias klamrowy a tylnym ukośnikiem

Alxbrd
źródło
znajdź: brakujący argument dla `-exec '
jakiś pomysł, dlaczego to polecenie mówi do mnie „znajdź: brakujący argument dla„ -exec ”? Dzięki.
Dodaj odstęp między zamykającym nawias klamrowy a\;
poussma,
2

Jeśli użyjesz dużej litery X chmod, możesz użyć jej do ustawienia uprawnień do wykonywania tylko dla katalogów. to znaczy

chmod -R ugo+X .
Stephen Quan
źródło
1

Znalazłem to rozwiązanie, które zadziałało dla mnie. W przypadku folderów i podfolderów:

chmod -R 777 */

I dla wszystkich plików (także w folderach i podfolderach):

find . -type f -name "*" | xargs chmod 644

Wszystkie komentarze są mile widziane, jeśli nie jest to dobry sposób na zrobienie tego. Właśnie zacząłem uczyć się Linuksa.

Po komentarzach bardziej solidnym rozwiązaniem, które ładnie obsługuje znaki specjalne, byłoby:

find . -type f -print0 | xargs -0 chmod 644  # For files
find . -type d -print0 | xargs -0 chmod 755  # For directories
Kaspar L. Palgi
źródło
Ale drugie polecenie daje mi w wielu plikach takie dane wyjściowe: chmod: nie można uzyskać dostępu do the': No such file or directory chmod: cannot access Logo.txt ': Brak takiego pliku lub katalogu chmod: nie można uzyskać dostępu do `./blog/wp-content/themes/OneRoom/LOGO': Brak takiego pliku lub di
2
777jest niebezpieczny i ma zastosowanie tylko do bardzo niewielkiej mniejszości systemów.
sarnold
2
Aby poprawić na swoim drugim poleceniu find . -type f -print0 | xargs -0 chmod 644. -name "*"Nie jest to konieczne, i xargs(1)będzie analizować nazw na przestrzeni lub znakami nowej linii , chyba że używasz -0- który przetwarza nazwy plików na ASCII NULznaku, który nie może pojawiać się w nazwach plików. -print0Dla find(1)prosi go sformatować swoje wyjście w trybie odpowiednim do xargs -0wejścia.
sarnold
0

odnaleźć . -type f -exec chmod 644 {} \;

szynka
źródło
2
Witamy w Superuser. Informujemy, że odpowiedzi na 1 linię są rzadko akceptowane. Czy możesz uściślić swoje odpowiedzi?
50-3