Chmod recursivo somente pastas ou somente arquivos via script ou menu nautilus?

8

Isso foi discutido antes aqui .

O que eu gostaria de saber é como transformar isso:

Chmod recursivo somente arquivos dentro desta pasta:

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

Chmod recursivo somente pastas 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 nautilus com o botão direito, se isso for possível.

    
por DM8 11.06.2011 / 00:02

3 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 este 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" {} +

Explanations: mode=$1; shift define a variável mode como o primeiro argumento do script e remove o primeiro argumento da lista. "$@" se expande para a lista de todos os argumentos.

Se quiser, você pode criar um script que aceite tanto um modo de diretório quanto um modo 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" {} +

Note que o 744 não é um modo de arquivo útil; 644 (user-writable e world-readable) e 755 (também world-executable) 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 este script com argumentos como +rX (capital X , para definir o bit executável somente para diretórios e para arquivos que já são executáveis). De fato, o modo simbólico X é provavelmente o que você estava procurando com esses scripts: chmod -R +rX . .

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

chmod a+rx **/*/

No zsh, você só pode atuar em arquivos sufixando (.) : chmod a+r **/*(.) .

Vou passar a questão do Nautilus.

    
por 11.06.2011 / 00:22
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 do arquivo próprio do 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
    
por 25.06.2014 / 19:56
0

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

link

Espero que ajude!

    
por 18.09.2012 / 14:34