Come chown / chmod tutti i file nella directory corrente?


56

Sto cercando di cambiare la proprietà e le autorizzazioni di alcuni file (e directory) nella directory corrente. Ho provato questo:

chown username:groupname .

... mi aspettavo che avrebbe effetto su tutti i file nella directory corrente, ma invece riguardava solo la directory in cui mi trovo (che è l'opposto di quello che voglio fare). Voglio cambiarlo su tutti i file senza influire sulla directory corrente in cui mi trovo.

Come posso chown e chmod tutti i file nella directory corrente?


man chowne man chmodrispondi facilmente alla tua domanda.
Shi,

2
@Shi Penso che sia una domanda giusta. Leggere quella pagina man non sarebbe d'aiuto. Globbing non fa parte di chmod. È incorporato nella shell. Anche leggere la documentazione sul globbing ti succhia la vita (ho passato molto tempo a capire tutte le funzionalità di zsh).
djf,

1
@djf:chown -R user:group .
Shi

Risposte:


96

Si desidera utilizzare chown username:groupname *e consentire alla shell di espandere *il contenuto della directory corrente. Ciò modificherà le autorizzazioni per tutti i file / cartelle nella directory corrente, ma non il contenuto delle cartelle.

Potresti anche farlo chown -R username:groupname ., il che cambierebbe le autorizzazioni sulla directory corrente e quindi ricorrere verso il basso al suo interno e tutte le sottocartelle per modificare le autorizzazioni.

chown -R username:groupname *cambierà le autorizzazioni su tutti i file e le cartelle in modo ricorsivo, lasciando sola la directory corrente. Questo stile e il primo stile sono quelli che mi ritrovo a usare più spesso.


2
@Andrew Stai in guardia, però, può essere sia amico che nemico per lo stanco o impreparato.
Darth Android,

5
Inoltre, fai attenzione ai pericoli del periodo. Come è posizionato proprio accanto all'onnipotente "/" sulla tastiera. Un semplice errore di battitura può facilmente trasformarsi chown -R username:groupname .in chown -R username:groupname /. Trasformare un compito di 2 secondi in un incubo di 2 giorni.
Teynon,

@Tom Ecco perché probabilmente dovrei iniziare a usare -vtutti i miei comandi ricorsivi, ma troppo pigro
Kolob Canyon,

Appena votato come il migliore e più conciso risponditore, anche se sarei specifico e dare un nome alla directory, solo per evitare un errore della tastiera:chown -R username:groupname directoryname
Dave Everitt

9

Penso che tu voglia questo:

chown username:groupname *

Se vuoi anche cambiare ricorsivamente le sottodirectory, avrai bisogno dell'opzione -R( -rè deprecata):

chown -R username:groupname *


0

chownè fantastico se sei un superutente. Ho avuto un problema in cui qualcun altro era stato eseguito makenella mia directory e ora possedevo alcuni file che non potevo modificare. Ecco la mia soluzione alternativa che gestisce file e directory, anche se lascia le directory in giro con il suffisso .mkmeownerse non può eliminarli.

  • Lo script seguente modifica la proprietà di file e directory passati ad esso di proprietà dell'utente corrente, tentando di aggirare i problemi di autorizzazione creando una nuova copia di ogni directory o file non di proprietà dell'utente corrente, eliminando (o tentando di eliminare) il file originale e la ridenominazione in modo appropriato.
  • L'intento è che sia l'abbreviazione di "fammi padrone". Non uso i trattini bassi perché sono difficili da scrivere.

Esempi:

% mkmeowner .

% mkmeowner dirpath1 dirpath2
  • Richiede che il seguente script mkmeowneronesia nel tuo percorso.

mkmeowner:

#!/bin/bash
[ "x$1" == "x-h" ] || [ "x$1" == "x--help" ] && cat << END && exit 0
Usage: $0 dirorfile [direorfile2 ...]:
    change ownership of directories or files to current user.
    Current user must have permissions to read those and write to owner directory.
END
mkmeownerone=`which mkmeownerone`
for d in $*; do
    find "$d" -not -user `whoami` -exec $mkmeownerone {} \;
done

mkmeownerone:

#!/bin/bash
# change ownership of one file or directory
f="$1"
expr match "${f}" '.*\.mkmeowner$' > /dev/null && exit 1 # already tried to do this one
if mv -f "$f" "${f}.mkmeowner"; then
    cp -pr "${f}.mkmeowner" "$f" && rm -rf "${f}.mkmeowner"
    exit 0
fi
exit 1

1
(1) Preferiamo risposte che includano alcune spiegazioni. Sono stato colto di sorpresa quando ho letto i tuoi copioni e ho visto quello che hanno fatto, perché il tuo paragrafo introduttivo non mi ha dato un'idea. (2) Hai dimenticato di dire che l'utente deve inserire mkmeowneroneil PERCORSO di ricerca.  mkmeowneresploderà se ciò non viene fatto. (3) Si prega di imparare come (cioè, quando e dove) utilizzare le virgolette nei comandi e negli script della shell. Dire ${f}non è un'alternativa utile; vedi questo . ... (proseguendo)
Scott

(Continua) ... (4) Se esegui lo script in una directory, potenzialmente copierà ogni file in quella directory due volte. (5)  exprè antiquato. È più efficiente eseguire una semplice corrispondenza delle stringhe nella shell; bash supporta anche la corrispondenza delle espressioni regolari. In tal caso, è possibile eseguire il test del nome file in find. (6) Il expr matchcomando verifica se ${f}termina con mkmeowner, non se termina con .mkmeowner. Pertanto, lo script non funzionerà su se stesso. ... (proseguendo)
Scott

(Proseguendo) ... Ora, probabilmente, questa è una buona cosa: non vuoi spostare e potenzialmente eliminare uno script mentre è in esecuzione. (Non causerà necessariamente un problema, ma può essere disordinato.) Ma dovresti capire (e documentare) casi speciali del genere. (7) Potresti voler usare i trattini bassi nelle stringhe composte da più parole.  dirorfileè difficile da leggere e comprendere (confronta con dir_or_file), e quando ho visto mkmeowner, il mio primo pensiero è stato di un gatto ( mk +  meow +  ner).
Scott

Grazie per le note Scott. 1. Pensavo di avere una spiegazione, ma vorrei essere più esplicito. 2. buon punto. L'avevo catturato nella mia sceneggiatura originale, ma ne ho tolto il riferimento. 3. Scrivo script di shell da 30 anni, ma cercherò di saperne di più. 4. Sì, lo fa. Di proposito perché se non possiedo la directory, non posso eliminarla. Posso menzionarlo. 5. Sì, sono vecchio stile, ma expr funziona ancora abbastanza bene 6. ha un buon punto. 7. Potrei, però, ritengo di ottenere una licenza artistica, poiché i trattini bassi non sono una regola. Ho bisogno di una sceneggiatura che faccia miagolare!
sbcondor

Non credo che ci sia qualcosa di sbagliato in $ {f}, giusto? È solo un po 'più lungo del necessario. È un formato che uso spesso perché potrei voler usare una variabile per creare una stringa più lunga come $ {f} .mkmeowner e non devo ricordare se $ f.heck significa $ {f} + diamine o $ { f.heck}
sbcondor
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.