Extrair arquivos e pastas com permissões especificadas

11

Compacto uma pasta com muitas subpastas e arquivos no Windows com 7zip, carrego no VPS e, em seguida, execute o comando:

tar -xvzf file.tar.gz

todos os arquivos e pastas descompactados têm permissões 777. Como faço para obtê-los para que as pastas tenham permissões 755 e arquivos 644?

Kaspar L. Palgi
fonte
Existe um site chamado "Command Line Fu" que tem muitas outras idéias também.
djangofan

Respostas:

13

Se você estiver executando tar(1)como um usuário comum, ele aplicará o seu umaskpor padrão. Se você estiver executando tar(1)como root, poderá dar a --no-same-permissionsopção de linha de comando para pedir tar(1)para respeitar o umask.

Então: execute isso como um usuário comum:

umask 022
tar zxvf file.tar.gz

ou execute isso como root:

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

Você pode querer ficar umask 022em seu ~/.bashrc, ~/.bash_profileou ~/.profile. (Veja a página de bash(1)manual para obter detalhes completos sobre os arquivos de inicialização. É complicado.)

Detalhes sobre umaskpodem ser encontrados na página de manual do seu shell, na página umask(2)de chamada de sistema ou na página umask(1posix)de manual do utilitário fornecido pelo POSIX (se você tiver o manpages-posixinstalado).

sarnold
fonte
umask 022 tar zxvf file.tar.gz -> isso solicita a confirmação de cada arquivo separadamente, se eu quiser extraí-lo #
Você está sobrescrevendo arquivos existentes ao fazê-lo?
sarnold
6

Execute os seguintes comandos na raiz do diretório para definir as permissões desejadas para seus diretórios e arquivos:

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

Esteja ciente do espaço entre o colchete de fechamento e a barra traseira

alxbrd
fonte
find: argumento ausente para `-exec '
Alguma idéia de por que esse comando me diz "find: missing argument to` -exec '"? Obrigado.
Adicione um espaço entre o colchete de fechamento e o\;
poussma
2

Se você usar X maiúsculo, chmodpoderá usá-lo para definir as permissões de execução apenas nos diretórios. ie

chmod -R ugo+X .
Stephen Quan
fonte
1

Encontrei esta solução que funcionou para mim. Para pastas e subpastas:

chmod -R 777 */

E para todos os arquivos (também em pastas e subpastas):

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

Todos os comentários são bem-vindos se essa não for uma boa maneira de fazê-lo. Eu apenas comecei a aprender Linux.

Após os comentários, uma solução mais robusta que lida com caracteres especiais seria:

find . -type f -print0 | xargs -0 chmod 644  # For files
find . -type d -print0 | xargs -0 chmod 755  # For directories
Kaspar L. Palgi
fonte
Mas o segundo comando me fornece em muitos arquivos esta saída: chmod: não pode acessar the': No such file or directory chmod: cannot access Logo.txt ': não existe esse arquivo ou diretório chmod: não pode acessar `./blog/wp-content/themes/OneRoom/LOGO': nenhum arquivo ou de reitoria
2
777é perigoso e aplicável apenas a uma minoria muito pequena de sistemas.
sarnold
2
Para melhorar seu segundo comando find . -type f -print0 | xargs -0 chmod 644,. A -name "*"não é necessário, e xargs(1)irá analisar nomes em espaços ou novas linhas a menos que você usar o -0- que analisa nomes de arquivos em ASCII NULpersonagem, que não pode aparecer em nomes de arquivos. O -print0for find(1)pede para formatar sua saída em um modo adequado para xargs -0entrada.
sarnold
0

encontrar . -tipo f -exec chmod 644 {} \;

odiado
fonte
2
Bem-vindo ao Superusuário, esteja ciente de que respostas de 1 linha raramente são aceitas. Você pode elaborar mais sobre sua resposta?
50-3