Chmod ricorsivamente


249

Ho un archivio, che è archiviato da qualcun altro, e voglio automaticamente, dopo averlo scaricato, cambiare un ramo del file system all'interno dei file estratti per ottenere l'accesso in lettura. (Non posso cambiare la modalità di creazione dell'archivio).

Ho esaminato questo thread: chmod: come aggiungere ricorsivamente permessi di esecuzione solo ai file che hanno già i permessi di esecuzione come in alcuni altri, ma nessuna gioia.

Le directory originariamente vengono fornite con più ma tutte le bandiere sbagliate, possono apparire come:

drwx------
d---r-x---
drwxrwxr-x
dr--r-xr--

Questi sono solo i pochi che ho scoperto finora, ma potrebbero essere di più.

find errori quando si tenta di cercare in una directory con no x autorizzazione e quindi non la passa a chmod. Quello che ho fatto finora è cambiare manualmente le autorizzazioni nella directory principale, quindi andare nelle directory secondarie e fare lo stesso per loro e così via. Ma questo è un sacco di lavoro manuale. Non c'è un modo per farlo automaticamente?

Cioè come lo sto facendo ora:

fare:

$ chmod -R +x
$ chmod -R +r

fino a quando non ricevo errori, quindi

$ find -type f -exec chmod -x {} +

Ma deve esserci un modo migliore.


3
-r non è lo stesso di -R
PJ Brunet,

Nota a parte, se vuoi dire che tutte le autorizzazioni di gruppo corrispondono alle autorizzazioni del proprietario (sembra meno probabile che riesca a
scavare tutto nell'IMO

Risposte:


131

È necessario l'accesso in lettura, oltre a eseguire l'accesso, per elencare una directory. Se hai solo l'accesso di esecuzione, puoi scoprire i nomi delle voci nella directory, ma nessuna altra informazione (nemmeno i tipi, quindi non sai quali delle voci sono sottodirectory). Questo funziona per me:

find . -type d -exec chmod +rx {} \;

2
Qual è la differenza tra '\;' e '+' utilizzato dall'OP alla fine del comando?
kon psych,

1
@konpsych Apparentemente +costruisce la riga di comando in un modo diverso. In realtà non ne ero a conoscenza; \;è il solito modo, con un comando per file che corrisponde alla ricerca.
Fred Foo,

Non funziona se alcuni file hanno spazi nel loro nome
Soonts

3
@Soonts Quindi "{}"invece di {}ripararlo.
user4642212

Ho eseguito questo sotto il sottosistema Linux su Windows 10 e ha avuto l'effetto opposto. La maggior parte delle autorizzazioni per i file sono state rimosse.
Max Candocia,

176

Puoi usare chmod con la Xlettera di modalità (la X maiuscola) per impostare il flag eseguibile solo per le directory.

Nell'esempio seguente il flag eseguibile viene cancellato e quindi impostato ricorsivamente per tutte le directory:

~$ mkdir foo
~$ mkdir foo/bar
~$ mkdir foo/baz
~$ touch foo/x
~$ touch foo/y

~$ chmod -R go-X foo 
~$ ls -l foo
total 8
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 bar
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

~$ chmod -R go+X foo 
~$ ls -l foo
total 8
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 bar
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

Un po 'di spiegazione:

  • chmod -x foo- cancella il flag eXecutable perfoo
  • chmod +x foo- imposta il flag eXecutable perfoo
  • chmod go+x foo- come sopra, ma imposta il flag solo per il gruppo e altri utenti, non toccare l' utente autorizzazione (proprietario)
  • chmod go+X foo - come sopra, ma si applica solo alle directory, non toccare i file
  • chmod -R go+X foo- come sopra, ma ricorsivamente per tutte le sottodirectory difoo

80

Prova a cambiare tutte le convinzioni contemporaneamente:

chmod -R +xr

Ciò consentirà di eseguire le autorizzazioni di esecuzione anche su tutte le non directory.
Fred Foo,

1
Sì. Questo sostituisce solo il primo passaggio ripetuto. Devi ancora correre find -type f -exec chmod -x {} +dopo.
Choroba,

50

Per rendere tutto scrivibile dal proprietario, leggi / esegui dal gruppo ed eseguibile dal mondo:

chmod -R 0755

Per rendere tutto aperto:

chmod -R 0777

12
Aggiungi la posizione corrente della cartella:chmod -R 0777 .
Danijel

18

Aggiunta di autorizzazioni eseguibili, in modo ricorsivo , a tutti i file (non cartelle) all'interno della cartella corrente con shestensione:

find . -name '*.sh' -type f | xargs chmod +x

* Nota la pipe ( |)


2

Dai 0777 a tutti i file e le directory a partire dal percorso corrente:

chmod -R 0777 ./

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.