La modalità ricorsiva funziona solo su directory, non su file. Usando il glob '* .pdf' la shell sta passando l'elenco dei file a chown, che vede questi sono file e cambia le autorizzazioni sui file che vede, e basta.
Ricorda, nelle shell, il glob viene valutato dalla shell, non dal comando. Se il glob corrisponde ai file, vengono passati al comando e il comando non sa mai che esiste un glob. (Questo è diverso da come il prompt dei comandi di Windows usava fare le cose). Se hai un dir, con i contenuti qualcosa di simile a:
machine:$ ls -F
file1.pdf file2.pdf other.txt subdir/
E hai digitato:
chown -R someuser:somegroup *.pdf
La shell dovrebbe prima fare la lista: file1.pdf file2.pdf
e quindi esegui il tuo comando:
chown -R someuser:somegroup file1.pdf file2.pdf
Vedi, non esiste una directory per -R su cui agire. Fa quello che gli hai chiesto: cambia la proprietà dei due file sulla riga di comando, ignorando quel bizzarro flag -R.
Per fare quello che vuoi, usare '* .pdf' come modello per questa directory e sottodirectory, puoi usare find
, che può trovare file che corrispondono a un modello di file (o molti altri criteri) e passare a un sottocomando
find . -type f -name '*.pdf' | xargs chown someuser:somegroup
Questo inizia nella directory corrente '.' per cercare i file (tipo di file f) del modello del nome, '*.pdf'
quindi passa a xargs, che costruisce una riga di comando in chmod. Nota le virgolette attorno al modello '*.pdf'
, ricorda che la shell creerà un glob se può, ma vuoi che il modello sia passato find
, quindi devi citarlo.
Poiché i nomi dei file possono contenere spazi, devi usare un trucco per renderlo sicuro con nomefile:
find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup
In bash 3 e in basso, questo è il modo in cui devi farlo. Globbing più potente è disponibile in bash 4 (con shopt -s globstar
) e altri gusci. Lo stesso in zsh, usando un glob ricorsivo **
:
chown -R someuser:somegroup ./**/*.pdf
shopt -s globstar
fa globbing ricorsivo.