¿Carpetas recursivas solo chmod o solo archivos a través de script o menú nautilus?

8

Esto ha sido discutido antes aquí .

Lo que me gustaría saber es cómo convertir estos:

Archivos chmod recursivos solo dentro de esta carpeta:

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

Carpetas recursivas solo chmod dentro de esta carpeta:

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

en un script bash, por lo que podría ser algo como:

Para archivos:

rchmodf 744 .

Para directorios:

rchmodd 755 .

y ... también tal vez en una opción de menú de clic derecho nautilus si es posible.

DM8
fuente

Respuestas:

10

Aquí hay un script que puede llamar pasando el modo como primer argumento y uno o más nombres de directorio como argumentos posteriores. En Linux, si no pasa ningún nombre de directorio, será como si hubiera pasado .(el directorio actual). Asigne un nombre a este script rchmodf, hágalo ejecutable ( chmod a+rx /path/to/rchmodf) y colóquelo en algún lugar de su $PATH.

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

Explicaciones: mode=$1; shiftestablece la variable modeen el primer argumento de la secuencia de comandos y elimina ese primer argumento de la lista. "$@"se expande a la lista de todos los argumentos.

Si lo desea, puede crear un script que acepte tanto un modo de directorio como un modo de archivo.

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

Tenga en cuenta que 744 no es un modo de archivo útil; 644 (escribible por el usuario y legible por el mundo) y 755 (también ejecutable por el mundo) son mucho más comunes. Además, cambiar cada archivo en un árbol para que sea ejecutable o no ejecutable rara vez es útil; probablemente desee llamar a este script con argumentos como +rX(mayúscula X, para establecer el bit ejecutable solo para directorios y para archivos que ya son ejecutables). De hecho, el Xmodo simbólico es probablemente lo que fueron después con estos guiones: chmod -R +rX ..

Con bash o zsh, hay otra forma de actuar de forma recursiva pero solo en directorios. Para bash, necesitas la versión 4 y ejecutar shopt -s globstarprimero.

chmod a+rx **/*/

En zsh, puede actuar sobre los archivos sólo sufijando (.): chmod a+r **/*(.).

Pasaré la pregunta de Nautilus.

Gilles 'SO- deja de ser malvado'
fuente
Ninjas y nincompoops! ¿Puede usar un hallazgo para ejecutar diferentes comandos en diferentes conjuntos de resultados? +1 por sobrecargar el operador OR.
Caleb
1

Script vinculado por user23538, espero que no te importe.

Lo he intentado y funciona bien. Tenga en cuenta que si lo usa. como argumento de ruta (ejecútelo en el mismo directorio donde se encuentra el script), de hecho, cambia los permisos de archivo propios de los scripts a 644, así que póngalo en el directorio anterior.

#!/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
fuente
@ user23538 ya recibió instrucciones de pegar el código en un bloque en el sitio. No debe publicar exactamente eso a menos que tenga algo más que agregar.
HalosGhost
Se les indicó que lo hicieran, pero no lo hicieron. Así que lo hice. Eso es lo que se solicitó, incluso si no soy la misma persona. Por favor explique por qué esto es incorrecto?
Kluny
Ahh, extrañé cuánto tiempo atrás el usuario había publicado su respuesta. Si encuentra algo sobre su respuesta para editar, me complacerá eliminar mi voto negativo.
HalosGhost
0

Escribí un script que básicamente hace lo anterior, pero también proporciona un poco de flexibilidad para las opciones de línea de comando (permisos de directorio y / o archivo, o excluye ambos, restablece automáticamente todo a 755-644). También comprueba algunos escenarios de error.

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

usuario23538
fuente
2
Deberías pegar el código aquí. De esa manera, evitamos muchos enlaces muertos en el futuro. Si le preocupa que las dos versiones se separen, aún puede dejar el enlace allí como referencia.
l0b0