Como criar um diretório e dar permissão em um único comando

107

Como criar um diretório e dar permissão em comando único no Linux?

Tenho que criar várias pastas com permissão total 777.

Comandos

mkdir path/foldername
chmod 777 path/foldername 

Não gosto de criar e dar permissão em dois comandos. Posso fazer isso em um único comando?

Pobreani
fonte
1
mkdir temp; chmod 777 tempé uma linha. Você pode tornar 'temp' uma variável e salvá-la como um comando bash. É isso que você está procurando fazer?
elegante
1
oi @ rosa-branca, por favor, veja a resposta mais recente, deve ser a resposta aceita. bônus, ele combina mkdir, chmod E chown em um único marcador!
Costin Gușă

Respostas:

205

De acordo com a página de manual de mkdir ...

mkdir -m 777 dirname
alex
fonte
1
Você pode me dizer sobre a opção -m?
Pobreani
A opção @Whiterose -m é para Modo. Define os bits de permissão para os diretórios recém-criados com o valor especificado pela variável Mode. A variável Mode assume os mesmos valores que o parâmetro Mode para o comando chmod, em forma simbólica ou numérica.
TMKasun
14
mkdir -p -m está quebrado, já que o modo é aplicado apenas ao último diretório no caminho que você digitar. Por exemplo, mkdir -p -m 707 um / dois / três. Mesmo que todos os três diretórios tenham sido criados recentemente, apenas o último terá as permissões solicitadas e os outros, o padrão. install -d -m é quebrado da mesma maneira.
Nome de exibição
Ao lado do problema em torno do -p@DisplayName já mencionado acima, há também outro. O -mserá aplicado apenas se um diretório for realmente criado. Se já existir, seu modo não será alterado. Dependendo do seu contexto, isso pode ser bom ou ruim.
Adam Badura
1
diretório mkdir -m777
Hugo Deiró
19
install -d -m 0777 /your/dir

deve dar a você o que você deseja. Esteja ciente de que todo usuário tem o direito de adicionar e excluir arquivos nesse diretório.

Markus W Mahlberg
fonte
1
bônus, você também pode adicionar -g e / ou -o e pode ter mkdir, chmod e chown em um único tiro!
Costin Gușă
4
Está quebrado. instalar -d -m 070 um / dois / três. Mesmo se todos os três diretórios no caminho forem criados recentemente, apenas o último terá as permissões solicitadas definidas. mkdir -p -m é quebrado da mesma maneira.
Nome de exibição
@DisplayName: que, no entanto, define as permissões corretas para three, com as permissões padrão sendo suficientes para o caminho para ele.
Markus W Mahlberg
16

Quando o diretório já existe:

mkdir -m 777 /path/to/your/dir

Quando o diretório não existe e você deseja criar os diretórios pais:

mkdir -m 777 -p /parent/dirs/to/create/your/dir
Pedro Trujillo
fonte
Isso só dará permissão 777 para o subdiretório final. Como posso fazer isso e dar permissão 777 a todos os diretórios pais também?
Levi Johansen
1
Não tenho uma resposta para isso, mas acredito que a resposta para isso está aqui: stackoverflow.com/questions/3740152/…
Pedro Trujillo
Observe que este comando é para resolver este problema "Como criar um diretório e dar permissão em um único comando". Acredito que a solução para sua pergunta seja algo como:find /your/dirs -type d -exec chmod 755 {} \;
Pedro Trujillo
10

IMO, é melhor usar o installcomando nessas situações. Eu estava tentando tornar systemd-journaldpersistente nas reinicializações.

install -d  -g systemd-journal -m 2755 -v /var/log/journal
Badi
fonte
7

Você pode escrever um script de shell simples, por exemplo:

#!/bin/bash
mkdir "$1"
chmod 777 "$1"

Depois de salvo e com o sinalizador de executável habilitado, você pode executá-lo em vez de mkdir e chmod:

./scriptname path/foldername

No entanto, a resposta de alex é muito melhor porque gera um processo em vez de três. Eu não sabia sobre a -mopção.

Delan Azabani
fonte
Obrigado delan .. Eu também escrevi esse comando em script de shell .. Mas eu quero fazer em um único comando.
Pobreani
7

Apenas para expandir e melhorar algumas das respostas acima:

Primeiro, verificarei a página de manual mkdir do GNU Coreutils 8.26 - ela nos dá esta informação sobre a opção '-m' e '-p' (também pode ser fornecida como --mode = MODE e --parents, respectivamente ):

... definir modo de arquivo (como em chmod), não a = rwx - umask

... nenhum erro se existente, crie diretórios pais conforme necessário

As declarações são vagas e confusas na minha opinião. Mas basicamente, ele diz que você pode fazer o diretório com as permissões especificadas por "notação numérica chmod" (octais) ou você pode ir "para o outro lado" e usar um / seu umask.

Observação lateral: digo "o outro lado", pois o valor de umask é exatamente o que parece - uma máscara , ocultando / removendo permissões em vez de "concedê-las" como na notação octal numérica de chmod.

Você pode executar o comando embutido em shell umaskpara ver qual é o seu umask de 3 dígitos; para mim, é 022. Isso significa que quando eu executar mkdir yodirectoryem uma determinada pasta (digamos, mahome) e statela, obtenho uma saída semelhante a esta:

               755                   richard:richard         /mahome/yodirectory
 #          permissions                 user:group      what I just made (yodirectory),
 # (owner,group,others--in that order)                 where I made it (i.e. in mahome)
 # 

Agora, para adicionar um pouco mais sobre essas permissões octais. Quando você faz um diretório, "seu sistema" pega seu diretório padrão perms '[que se aplica a novos diretórios (seu valor deve ser 777)] e coloca sua máscara de yo (u), efetivamente escondendo alguns desses perms'. Meu umask é 022 - Agora, se "subtrair" 022 de 777 (tecnicamente subtraindo é um reducionismo e nem sempre correta - na verdade estamos desligando perms ou mascarar ing-los) ... temos 755 como indicado (ou "statted" ) antes.

Podemos omitir o '0' na frente dos octais de 3 dígitos (para que não precisem ser de 4 dígitos), pois em nosso caso não queríamos (ou melhor, não mencionamos) nenhum stickybits, setuids ou setgids (você pode querer olhar para eles, aliás, eles podem ser úteis já que você está indo para o 777). Em outras palavras, 0777 implica (ou é equivalente a) 777 (mas 777 não é necessariamente equivalente a 0777 - já que 777 especifica apenas as permissões, não os setuids, setgids, etc.)

Agora, para aplicar isso à sua pergunta em um sentido mais amplo - você (já) tem algumas opções. Todas as respostas acima funcionam (pelo menos de acordo com meus coreutils). Mas você pode (ou é provável que tenha) problemas com as soluções acima quando quiser criar subdiretórios (diretórios aninhados) com 777 permissões de uma só vez. Especificamente, se eu fizer o seguinte em mahome com um umask de 022:

mkdir -m 777 -p yodirectory/yostuff/mastuffinyostuff
# OR (you can swap 777 for 0777 if you so desire, outcome will be the same)
install -d -m 777 -p yodirectory/yostuff/mastuffinyostuff

Vou obter permanentes 755para ambos yodirectorye yostuff, com apenas 777permanentes para mastuffinyostuff. Portanto, parece que umaské tudo o que foi aplicado yodirectorye yostuff... para contornar isso, podemos usar uma subcamada:

( umask 000 && mkdir -p yodirectory/yostuff/mastuffinyostuff )

e é isso. 777 permanentes para yostuff, mastuffinyostuff e yodirectory.

YenForYang
fonte
7

você pode usar o seguinte comando para criar diretório e dar permissões ao mesmo tempo

mkdir -m777 path/foldername 
Omer Gafar
fonte
1
não há espaço entre -m e 777
Omer Gafar
1

Não faça: mkdir -m 777 -p a/b/c já que isso só definirá a permissão 777no último diretório, c; a e b serão criados com a permissão padrão de seu umask.

Em vez de criar novos diretórios com permissão 777, execute mkdir -pem um subshell em que você substitui o umask:

(umask u=rwx,g=rwx,o=rwx && mkdir -p a/b/c)

Observe que isso não mudará as permissões se algum de a, bec já existir.

John Mellor
fonte
Sim, se você passar um umask de 4 dígitos, o dígito principal sempre terá que ser zero (embora você possa omiti-lo). Pode ser para simetria com chmod, onde o primeiro dígito octal define os bits setuid, setgid e sticky, mas se for assim, é um tanto inútil, já que umask não permite que você os restrinja.
John Mellor