Utilizzare il comando chmod in modo selettivo


11

Voglio impostare l'autorizzazione 755 su tutti i file e sottodirectory in una directory specifica, ma voglio eseguire chmod 755 solo per quei componenti che non dispongono dell'autorizzazione 755.

find /main_directory/ -exec chmod 755 {} \;

Se il findcomando restituisce un lungo elenco, ciò richiederà molto tempo. So che posso usare il comando stat per controllare l'autorizzazione a livello di file ottale di ciascun componente e quindi utilizzare if-else per attivare l'autorizzazione del file, ma esiste un approccio a riga singola che utilizza finde xargsper verificare innanzitutto quale autorizzazione ha il file / directory , quindi utilizzare chmodper modificarlo in 755 se è impostato su qualcos'altro.


6
Questa potrebbe essere un'ottimizzazione prematura e potrebbe anche non essere più veloce. Fare tutti questi controlli potrebbe rallentarlo. Test per assicurarsi che sia più veloce, pagherà solo se devi farlo molto.
ctrl-alt-delor

3
Probabilmente non vuoi dare autorizzazioni di esecuzione a tutti i file. Ciò creerà un rischio per la sicurezza. (questo è uno dei vettori di virus su Windows di Microsoft: tutto è eseguibile). In modalità simbolica puoi dire u+rw,go+r,go-w,ugo+X- nota la capitale.
ctrl-alt-delor

Sono d'accordo con @ ctrl-alt-delor ma suggerirei qualcosa di più vicino a quello che hai chiesto, u = rwX, go = rX che dovrebbe raggiungere la stessa cosa.
penguin359

Risposte:


21

Se si desidera modificare le autorizzazioni 755su entrambi i file e le directory, non vi è alcun reale vantaggio nell'utilizzo find(almeno dal punto di vista delle prestazioni) e si potrebbe semplicemente fare

chmod -R 755 /main_directory

Se vuoi davvero usarlo findper evitare di cambiare permessi su cose che hanno già 755permessi (per evitare di aggiornare il loro timestamp ctime), allora dovresti anche testare i permessi correnti su ogni directory e file:

find /main_directory ! -perm 0755 -exec chmod 755 {} +

Il -exec ... {} +raccoglierà il maggior numero possibile di percorsi che passa la ! -perm 0755prova, ed eseguire chmodsu tutti in una volta.

Di solito, si vorrebbe cambiare le autorizzazioni su file e directory separatamente, in modo che non tutti i file siano eseguibili:

find /main_directory   -type d ! -perm 0755 -exec chmod 755 {} +
find /main_directory ! -type d ! -perm 0644 -exec chmod 644 {} +

Ha funzionato come un incantesimo, grazie. Saluti, Kumarjit
Kumarjit Ghosh

1
Sospetto che usare +invece di ;fare una grande differenza qui.
Kevin

Questo è il modo più veloce: evitare un controllo. Vorrei inoltre utilizzare find per creare un elenco di soli file per i quali si è autorizzati a modificare questo, per evitare errori chmod sui file che non è possibile modificare. <pre> <code> # rwx, rw, wx, w trova solo. -user $ (whoami) -perm / 002! -perm 0755 -exec chmod 0755 {} \; # break in due operazioni trova. -user $ (whoami) -perm / 002! -perm 0755> /tmp/chfiles.txt per il file in $ (</ tmp / chfiles.txt) chmod --quiet 0755 "$ {file}" fatto </code> </pre>
Chris Reid

@ChrisReid Nota che il ciclo su un elenco di nomi di percorso come quello si interromperà se un nome di percorso contiene un carattere di spazi.
Kusalananda

Immagino che tu debba cambiare l'Internal Field Separator (IFS) in '\ n' in uno script. Queste sono le impostazioni dell'ambiente, il modo in cui la shell le interpreta dipende dai valori di tali impostazioni. Ho testato gli script su file fittizi prima di usarli per scovare distorsori errati come rinominare i file o sovrascriverli. Mi piace il modo di stampa shell di impostare IFS. IFS = $ (printf "\ n") # molto leggibile
Chris Reid

1

Come findho ottenuto la -exec ... +sintassi, non ha molto senso usare xargs, ma come lo chiedi:

find /main_directory -not -perm 0755 | xargs chmod 755

1
Si noti inoltre che xargs senza -0(in combinazione con -print0in find; che è l'estensione GNU) può essere abbastanza problematico dal punto di vista della sicurezza se un potenziale attaccante può creare nomi di file che includono spazi bianchi o altri caratteri speciali. Quindi meglio attenersi a -execquando è possibile
Matija Nalis

Non c'è bisogno di xargs(basta usare -exec), e se lo usi dovresti usare -print0/ -0come dice Matija.
Kevin
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.