Pastas chmod recursivas apenas ou apenas arquivos via menu de script ou nautilus?

8

Isso já foi discutido aqui .

O que eu gostaria de saber é como transformar isso:

Arquivos chmod recursivos somente dentro desta pasta:

find . -type f -exec chmod 0600 {} \;

Pastas chmod recursivas somente dentro desta pasta:

find . -type d -exec chmod 0755 {} \;

em um script bash, então pode ser algo como:

Para arquivos:

rchmodf 744 .

Para diretórios:

rchmodd 755 .

e ... também talvez em uma opção de menu do clique direito do nautilus, se isso for possível.

DM8
fonte

Respostas:

10

Aqui está um script que você pode chamar passando o modo como o primeiro argumento e um ou mais nomes de diretório como argumentos subseqüentes. No Linux, se você não passar nenhum nome de diretório, será como se você tivesse passado .(o diretório atual). Nomeie esse script rchmodf, torne-o executável ( chmod a+rx /path/to/rchmodf) e coloque-o em algum lugar no seu $PATH.

#!/bin/sh
mode=$1; shift
find "$@" -type f -exec chmod "$mode" {} +

Explicações: mode=$1; shiftdefine a variável modepara o primeiro argumento do script e remove esse primeiro argumento da lista. "$@"expande para a lista de todos os argumentos.

Se desejar, você pode criar um script que aceite os modos de diretório e de arquivo.

#!/bin/sh
dir_mode=$1; shift
file_mode=$1; shift
find "$@" -type d -exec chmod "$dir_mode" {} + -o -type f -exec chmod "$file_mode" {} +

Observe que 744 não é um modo de arquivo útil; 644 (gravável pelo usuário e legível pelo mundo) e 755 (também executável pelo mundo) são muito mais comuns. Além disso, alterar todos os arquivos em uma árvore para serem executáveis ​​ou não executáveis ​​raramente é útil; você provavelmente desejará chamar esse script com argumentos como +rX(capital X, para definir o bit executável apenas para diretórios e arquivos que já são executáveis). Na verdade, o Xmodo simbólico é provavelmente o que você estava atrás com esses scripts: chmod -R +rX ..

Com o bash ou o zsh, há outra maneira de agir recursivamente, mas apenas em diretórios. Para o bash, você precisa da versão 4 e para executar shopt -s globstarprimeiro.

chmod a+rx **/*/

Em zsh, você pode agir sobre arquivos somente por sufixação (.): chmod a+r **/*(.).

Vou passar a pergunta do Nautilus.

Gilles
fonte
Ninjas e nincompoops! Você pode usar uma localização para executar comandos diferentes em diferentes conjuntos de resultados? +1 para sobrecarregar o operador OU.
Caleb
1

Script vinculado por user23538, espero que você não se importe.

Eu tentei e funciona bem. Por favor, note que se você usar. como o argumento do caminho (execute-o no mesmo diretório em que o script está localizado), ele de fato altera as permissões de arquivo do próprio script para 644, portanto, coloque-o no diretório acima.

#!/bin/sh
#
# chmodr.sh
#
# author: Francis Byrne
# date: 2011/02/12
#
# Generic Script for recursively setting permissions for directories and files
# to defined or default permissions using chmod.
#
# Takes a path to recurse through and options for specifying directory and/or
# file permissions.
# Outputs a list of affected directories and files.
#
# If no options are specified, it recursively resets all directory and file
# permissions to the default for most OSs (dirs: 755, files: 644).

# Usage message
usage()
{
echo "Usage: $0 PATH -d DIRPERMS -f FILEPERMS"
echo "Arguments:"
echo "PATH: path to the root directory you wish to modify permissions for"
echo "Options:"
echo " -d DIRPERMS, directory permissions"
echo " -f FILEPERMS, file permissions"
exit 1
}

# Check if user entered arguments
if [ $# -lt 1 ] ; then
usage
fi

# Get options
while getopts d:f: opt
do
case "$opt" in
d) DIRPERMS="$OPTARG";;
f) FILEPERMS="$OPTARG";;
\?) usage;;
esac
done

# Shift option index so that $1 now refers to the first argument
shift $(($OPTIND - 1))

# Default directory and file permissions, if not set on command line
if [ -z "$DIRPERMS" ] && [ -z "$FILEPERMS" ] ; then
DIRPERMS=755
FILEPERMS=644
fi

# Set the root path to be the argument entered by the user
ROOT=$1

# Check if the root path is a valid directory
if [ ! -d $ROOT ] ; then
echo "$ROOT does not exist or isn't a directory!" ; exit 1
fi

# Recursively set directory/file permissions based on the permission variables
if [ -n "$DIRPERMS" ] ; then
find $ROOT -type d -print0 | xargs -0 chmod -v $DIRPERMS
fi

if [ -n "$FILEPERMS" ] ; then
find $ROOT -type f -print0 | xargs -0 chmod -v $FILEPERMS
fi
Kluny
fonte
@ user23538 já foi instruído a colar o código em um bloco no local. Você não deve postar exatamente isso, a menos que tenha algo a acrescentar.
precisa saber é o seguinte
Eles foram instruídos, mas não foram. Então eu fiz. Foi isso que foi solicitado, mesmo que eu não seja a mesma pessoa. Por favor, explique por que isso está incorreto?
Kluny
Ahh, eu perdi há quanto tempo o usuário postou sua resposta. Se você encontrar algo sobre sua resposta para editar, ficarei feliz em remover meu voto negativo.
HalosGhost
0

Eu escrevi um script que basicamente faz o acima, mas também fornece um pouco de flexibilidade para as opções de linha de comando (permissões de diretório e / ou arquivo, ou excluir ambas, ele redefine automaticamente tudo para 755-644). Ele também verifica alguns cenários de erro.

http://bigfloppydonkeydisk.blogspot.com.au/2012/09/recursively-chmod-only-files-or.html

user23538
fonte
2
Você deve colar o código aqui. Dessa forma, evitamos muitos links mortos no futuro. Se você está preocupado com as duas versões distantes, ainda pode deixar o link lá para referência.
L0b0 22/09/12