Chmod ricorsivo solo cartelle o solo file tramite script o menu nautilus?


8

Questo è stato discusso prima qui .

Quello che mi piacerebbe sapere è come trasformare questi:

File chmod ricorsivi solo all'interno di questa cartella:

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

Cartelle ricorsive chmod solo all'interno di questa cartella:

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

in uno script bash, quindi potrebbe essere qualcosa del tipo:

Per i file:

rchmodf 744 .

Per le directory:

rchmodd 755 .

e ... forse anche in un'opzione del menu di scelta rapida di Nautilus, se possibile.

Risposte:


10

Ecco uno script che puoi chiamare passando la modalità come primo argomento e uno o più nomi di directory come argomenti successivi. Sotto Linux, se non passi alcun nome di directory, sarà come se lo avessi passato .(la directory corrente). Assegna un nome a questo script rchmodf, rendilo eseguibile ( chmod a+rx /path/to/rchmodf) e mettilo da qualche parte sul tuo $PATH.

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

Spiegazioni: mode=$1; shiftimposta la variabile modesul primo argomento dello script e rimuove quel primo argomento dall'elenco. "$@"si espande nell'elenco di tutti gli argomenti.

Se lo desideri, puoi creare uno script che accetta sia una modalità directory che una modalità file.

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

Si noti che 744 non è una modalità file utile; 644 (scrivibili dall'utente e leggibili dal mondo) e 755 (anche eseguibili dal mondo) sono molto più comuni. Inoltre, modificare ogni file in un albero in modo che sia eseguibile o non eseguibile è raramente utile; probabilmente vorrai chiamare questo script con argomenti come +rX(maiuscolo X, per impostare il bit eseguibile solo per le directory e per i file che sono già eseguibili). In realtà, il Xmodo simbolico è probabilmente quello che erano dopo con questi script: chmod -R +rX ..

Con bash o zsh, c'è un altro modo di agire in modo ricorsivo ma solo nelle directory. Per bash, è necessaria la versione 4 e per eseguire shopt -s globstarprima.

chmod a+rx **/*/

In zsh, si può agire sui file solo da suffisso (.): chmod a+r **/*(.).

Trasmetterò la domanda Nautilus.


Ninja e nincompoops! È possibile utilizzare una ricerca per eseguire comandi diversi su set di risultati diversi? +1 per sovraccarico dell'operatore OR.
Caleb,

1

Script collegato da user23538, spero non ti dispiaccia.

L'ho provato e funziona bene. Si prega di notare che se si utilizza. come argomento del percorso (eseguirlo nella stessa directory in cui si trova lo script), in effetti modifica le autorizzazioni del file proprio degli script in 644, quindi inseriscilo nella directory sopra.

#!/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

@ user23538 era già stato incaricato di incollare il codice in un blocco in loco. Non dovresti quindi pubblicare esattamente questo a meno che tu non abbia altro da aggiungere.
HalosGhost

Fu loro ordinato, ma non lo fecero. Così ho fatto. Questo è ciò che è stato richiesto, anche se non sono la stessa persona. Spiega perché questo non è corretto?
Kluny,

Ah, mi sono perso quanto tempo fa l'utente aveva pubblicato la sua risposta. Se trovi qualcosa sulla tua risposta da modificare, sarò felice di rimuovere il mio voto negativo.
HalosGhost

0

Ho scritto uno script che sostanzialmente fa quanto sopra ma offre anche un po 'di flessibilità per le opzioni della riga di comando (directory e / o permessi dei file, o escludendo entrambi reimposta automaticamente tutto su 755-644). Verifica inoltre alcuni scenari di errore.

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


2
Dovresti incollare il codice qui. In questo modo, eviteremo molti collegamenti morti in futuro. Se sei preoccupato per le due versioni che si allontanano, puoi comunque lasciare il link lì per riferimento.
l0b0,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.