De recursieve modus werkt alleen op mappen, niet op bestanden. Door het gebruik van de glob ‘*.pdf’ geeft de shell de bestandslijst door, die ziet dat dit bestanden zijn, en verandert de rechten op de bestanden die hij ziet, en dat is het.
Onthoud, in shells wordt de glob geëvalueerd door de shell, niet door het commando. Als de glob overeenkomt met bestanden, worden deze doorgegeven aan het commando en weet het commando nooit dat er een glob bestaat. (Dit is anders dan hoe Windows Command prompt de dingen deed). Als je een dir hebt, met de inhoud iets als:
machine:$ ls -F
file1.pdf file2.pdf other.txt subdir/
en je hebt getypt:
chown -R someuser:somegroup *.pdf
De shell zou eerst de lijst maken: file1.pdf file2.pdf
en dan je commando uitvoeren:
chown -R someuser:somegroup file1.pdf file2.pdf
Zie, er is geen map voor -R om op te treden. Het doet wat je gevraagd hebt - verander eigenaarschap op de twee bestanden op de commandoregel, en negeer die eigenzinnige -R vlag.
Om te doen wat je wilt, gebruik je de ‘*. pdf’ als patroon voor deze directory en subdirectories te gebruiken, kun je find
gebruiken, die bestanden kunnen vinden die overeenkomen met een bestandsnaampatroon (of vele andere criteria) en doorgeven aan een subcommando
find . -type f -name '*.pdf' | xargs chown someuser:somegroup
Dit begint in de huidige dir ‘.’ om te zoeken naar bestanden (filetype f) van naamspatroon '*.pdf'
en gaat dan over naar xargs, die een commandoregel naar chmod construeert. Let op de aanhalingstekens rond het patroon '*.pdf'
, onthoud dat de shell een glob zal maken als het kan, maar je wilt dat het patroon wordt doorgegeven aan find
, dus je moet het citeren.
Omdat bestandsnamen spaties kunnen hebben, wil je een trucje gebruiken om het bestandsnaam-met-ruimtes veilig te maken:
find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup
In bash 3 en lager, dit is de manier waarop je het moet doen. Krachtiger globbing is beschikbaar in bash 4 (met shopt -s globstar
) en andere schelpen. Hetzelfde in zsh, met behulp van een recursieve glob **
:
chown -R someuser:somegroup ./**/*.pdf