2011-03-22 16:29:12 +0000 2011-03-22 16:29:12 +0000
308
308

Come posso far funzionare chown in modo ricorsivo?

Ho una directory chiamata pdfs che contiene una serie di sotto- e sotto-directory. Voglio cambiare la proprietà su tutti i file PDF in tutte le sottocartelle. Ho appena provato questo:

chown -R someuser:somegroup *.pdf
``` ```
-R, --recursive
          operate on files and directories recursively

…ma non ha cambiato la proprietà dei PDF nelle sottocartelle. L'utente e il gruppo esistono.

Secondo la pagina man per chown, -R dovrebbe significare ricorsivo:

&001 &001

Cosa mi manca?

Risposte (7)

315
315
315
2011-03-22 16:47:32 +0000

La modalità ricorsiva funziona solo sulle directory, non sui file. Usando il glob ‘*.pdf’ la shell passa la lista dei file a chown, che vede questi sono file, e cambia i permessi sui file che vede, e questo è tutto.

Ricordate, nelle shell, il glob viene valutato dalla shell, non dal comando. Se il globo corrisponde ai file, questi vengono passati al comando e il comando non sa mai che un globo esiste. (Questo è diverso da come il prompt dei comandi di Windows era solito fare le cose). Se avete una dir, con il contenuto qualcosa come:

machine:$ ls -F
file1.pdf file2.pdf other.txt subdir/
``` ```
chown -R someuser:somegroup *.pdf

E avete digitato:

chown -R someuser:somegroup file1.pdf file2.pdf
``` ```
find . -type f -name '*.pdf' | xargs chown someuser:somegroup

La shell farebbe prima la lista: file1.pdf file2.pdf

e poi eseguire il comando:

find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup
``` ```
chown -R someuser:somegroup ./**/*.pdf

Vedi, non c'è una directory per -R su cui agire. Fa quello che gli avete chiesto - cambiare proprietà sui due file sulla linea di comando, ignorando quell'eccentrico flag -R.

Per fare quello che volete, usate il comando ‘*. pdf’ come modello per questa directory e sottodirectory, si può usare find, che può trovare file che corrispondono ad un modello di nome di file (o molti altri criterea) e passare ad un sottocomando

&001 &001

Questo inizia in dir corrente ‘.’ per cercare i file (filetype f) del modello di nome '*.pdf' poi passa a xargs, che costruisce una linea di comando per chmod. Notate le citazioni intorno al pattern '*.pdf', ricordate che la shell creerà un globo se può, ma volete che il pattern passi a find, quindi dovete citarlo.

Poiché i nomi dei file possono avere degli spazi al loro interno, volete usare un trucco per renderlo filename-con-spazio sicuro:

&001 &001

In bash 3 e inferiori, questo è il modo in cui dovete farlo. Il globbing più potente è disponibile nel bash 4 (con shopt -s globstar) e in altre conchiglie. Lo stesso in zsh, utilizzando un glob ricorsivo **:

&001

57
57
57
2015-11-09 11:44:58 +0000
chown -R someuser:somegroup /your/folder/here/*

Questo si applica a tutti i file e a tutte le sottocartelle e sottocartelle della cartella specificata. Utilizzare con cautela.

14
14
14
2011-03-22 16:37:41 +0000

È possibile utilizzare il programma di utilità find:

find . -name '*.pdf' -exec chown someuser:somegroup {} +

Non dimenticate le quotazioni intorno a *.pdf. Altrimenti la conchiglia cercherà di espanderla. Questo significa che già la shell sostituirà *.pdf con i nomi di tutti i file PDF che si trovano nella directory corrente. Ma non è quello che volete. Volete trovare i file PDF che si trovano nelle sottodirectory. Btw.: Questo è anche il problema con il tuo comando chown.

6
6
6
2011-03-22 16:38:07 +0000

Il comando

chown -R someuser:somegroup *.pdf
``` ```
find . -name "*.pdf" -exec chown someuser:somegroup {} \;

ricorrerà alle directory solo se il nome della _directory termina in .pdf. È necessario qualcosa come:

&001

1
1
1
2016-05-11 01:38:58 +0000

per cambiare la proprietà di una directory in modo ricorsivo è sufficiente utilizzare:

sudo chown -R <username>:<groupname> <dir name>

qui username = il nuovo utente che dovrebbe essere proprietario della directory

groupname = il nuovo gruppo che dovrebbe essere proprietario della directory

ogni file/directory ha un proprietario utente e un proprietario del gruppo

0
0
0
2018-01-25 13:36:51 +0000

Io uso tree invece:

sudo tree -fai ~/.blabla | xargs -L1 -I{} sudo chown youruser:youruser {}
``` &001 



Inoltre, fare attenzione a non eseguire chown o chmod ricorsivi sulla directory '/' o su altre directory di sistema.
0
0
0
2019-01-29 20:22:33 +0000

Per diventare proprietario di tutti i file di una directory, usare

find directory -type f -name '*' | sudo xargs -d '\n' chown $USER

invece di

sudo chown $USER directory\*

o

sudo chown --recursive $USER directory

che potrebbero non funzionare se ci sono troppi argomenti prodotti da * (troppi file nella directory) o che non fanno quello che si vuole rispettivamente.