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