Mac: batch endring av rettigheter i et hierarki
La oss anta en katalog inneholdende filer og andre kataloger. Underkatalogene inneholder igjen filer og kataloger, og så videre, i en dyp struktur med 1000-vis av filer og kataloger. Anta vi ønsker å endre rettighetene på alle filer og kataloger på en enkel måte.
Gi filer og kataloger samme rettigheter
chmod -R 600 .
Problemet her er er at kommandoen ikke skiller mellom filer og kataloger - både filer og kataloger blir 600, og får execute bit slått av. De fleste filer skal ha execute-bit slått av. Men ikke kataloger:
- Filer: execute-bit signaliserer at filen er et kjørbart program. På en filserver er typisk ingen av filene på en share kjørbare.
- Kataloger: hvis execute-bit ikke er satt, kan man ikke cd til katalogen. Da feiler også andre kommandoer. Eksempelvis får man ikke lest en fil i katalogen, selv om man har lese-rettigheter til filen. Årsaken er at lese-programmet (more) må cd inn i katalogen for å fungere. Man får listet filene i katalogen med ls selv om execute-bit ikke er satt (lese-bitet på katalogen må selvsagt være satt).
Differensier mellom filer og kataloger
Anta vi ønsker å endre rettighetene på alle filene til 600, mens katalogene skal ha 700.
For å endre rettigheter på alle filene, men ikke katalogene, i et hierarki:
find . -type f -print0 | xargs -0 chmod 600
For å endre rettigheter på alle katalogene, men ikke filene, i et hierarki:
find . -type d -print0 | xargs -0 chmod 700
Macmini
Jeg har benyttet begge kommandoene i et produksjonsmiljø. Katalogen var på omtrent 100GB og det var ca. 100 000 filer og kataloger. Kommandoen tok omtrent 2 minutter på å fullføre, på en middels rask maskin. Sjekk først at ditt system har tilstrekkelige find og xargs implementasjoner.
Macmini'en var fra år 2010, jeg husker ikke de nøyaktige maskin-spesifikasjonene.
Synology
Jeg hadde tilgjengelig en Synology DS1518+ med DSM 5.2-5644 Update 2. Den hadde en Intel Atom C2538 2,4GHz prosessor, 2GB RAM, 8 6-GB disker satt opp i et RAID5. Maskinen støttet de to kommandoene.
Hierarkiet var på 8.7 terrabyte med data, og hadde 772 503 filer og 19 462 kataloger. Dette ble bestemt med kommandoene
du -hd 1 .
find . -type f | wc -l
find . -type g | wc -l
Jeg har ikke noe godt måltall på dybden av hierarkiet, men anta på det meste omtrent 10 katalog-nivåer.
Jeg begynte med å endre owner og group på alle filer og kataloger. Dette ble gjort med kommandoen
chown -R newowner:newgroup /path/to/top/folder
Det tok 45 sekunder å kjøre kommandoen.
Deretter endret jeg rettighetene på alle filene (ikke katalogene) til 660. Kommandoen tok 38 sekunder.
Deretter endret jeg rettighetene på alle katalogene til 770. Kommandoen tok 21 sekunder.
Det virker rimelig å anta at tiden brukes på hierarki-traversering og rettighets-endring. Det virker rimelig å anta at hierarki-traverseringen er den samme for begge kommandoene. Det virker også rimelig å anta at det tar like lang tid å endre rettighetene på en fil som på en katalog. Fra måletallene ser vi at hierarki-traverseringen tok omtrent 20 sekunder, og at det tok omtrent 0.5 sekunder å endre rettighetene på 20 000 filer eller kataloger (mer nøyaktig: 20.56s for traversering, 2.25s for å endre 100 000 fil eller katalogrettigheter).
Vi ser også at det tok mye kortere tid å kjøre disse kommandoene på Synologyen enn på Macmini'en ovenfor.
Referanser
- changing chmod for files but not directories
http://stackoverflow.com/questions/1163294/changing-chmod-for-files-but-not-directories
- How to change file permissions for a directory in one command
http://superuser.com/questions/208606/how-to-change-file-permissions-for-a-directory-in-one-command