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

Hoe kan ik chown recursief laten werken?

Ik heb een directory genaamd pdfs die een aantal sub- en sub-sub-directories bevat. Ik wil van eigenaar veranderen op alle PDF-bestanden in alle submappen. Ik heb dit net geprobeerd:

chown -R someuser:somegroup *.pdf

…maar het veranderde niet het eigendom van de PDF’s in de submappen. De gebruiker en de groep bestaan wel.

Volgens de man pagina voor chown zou de -R recursief moeten betekenen:

-R, --recursive
          operate on files and directories recursively

Wat mis ik?

Antwoorden (7)

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

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
57
57
57
2015-11-09 11:44:58 +0000
chown -R someuser:somegroup /your/folder/here/*

Dit is van toepassing op alle bestanden en alle submappen en sub-submappen van de opgegeven map. Gebruik met zorg.

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

U kunt het hulpprogramma find gebruiken:

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

Vergeet de aanhalingstekens rond *.pdf niet. Anders zal de schelp proberen het uit te breiden. Dit betekent dat de shell *.pdf al zal vervangen door de namen van alle PDF-bestanden in de huidige directory. Maar dat is niet wat je wilt. Je wilt de PDF-bestanden vinden in submappen. Btw..: Dat is ook het probleem met je chown commando.

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

Het commando

chown -R someuser:somegroup *.pdf

zal de mappen alleen terughalen als de directory naam eindigt op .pdf. Je hebt iets nodig als:

find . -name "*.pdf" -exec chown someuser:somegroup {} \;
1
1
1
2016-05-11 01:38:58 +0000

om de eigendom van een directory recursief te wijzigen gebruikt u simpelweg:

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

hier gebruikersnaam = de nieuwe gebruiker die eigenaar zou moeten zijn van directory

groepsnaam = de nieuwe groep die eigenaar zou moeten zijn van directory

elk bestand/directory heeft een gebruikerseigenaar en een groepseigenaar

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

Ik gebruik tree in plaats daarvan:

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

Zorg er ook voor dat er geen recursieve chown of chmod op ‘/’ directory of andere systeemdirectory wordt uitgevoerd.

0
0
0
2019-01-29 20:22:33 +0000

Om eigenaar te worden van alle bestanden in een directory, gebruik je

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

in plaats van sudo chown $USER directory\*

of sudo chown --recursive $USER directory

die misschien niet werken als er te veel argumenten worden geproduceerd door * (te veel bestanden in de directory) of die niet doen wat je wilt, respectievelijk.