[unix] chmod -R alleen files of dirs

Pagina: 1
Acties:

  • Sir Isaac
  • Registratie: September 2002
  • Laatst online: 21-05-2025
Is er een eenvoudige manier manier om een chmod -R operatie op alleen directories of normale bestanden uit tevoeren?
Bijvoorbeeld: na kopieren vanaf een cd zijn alle files 444. De directories moeten naar 750 maar de files naar 640. Hoe doe je dat?

  • cowgirl
  • Registratie: November 2000
  • Laatst online: 18-12-2025
Kijk eens naar het find commando met de vlag -type voor de keuze bestanden/directories en -exec voor het chmod commando.

  • cowgirl
  • Registratie: November 2000
  • Laatst online: 18-12-2025
edit:
foutje

[ Voor 95% gewijzigd door cowgirl op 31-07-2003 11:25 ]


  • igmar
  • Registratie: April 2000
  • Laatst online: 20-04 22:06

igmar

ISO20022

Sir Isaac schreef op 31 July 2003 @ 11:16:
Is er een eenvoudige manier manier om een chmod -R operatie op alleen directories of normale bestanden uit tevoeren?
code:
1
find . -type f -print0 | xargs -0 chmod 640


Andere variaties zijn vanzelfsprekend mogelijk :)

  • Sir Isaac
  • Registratie: September 2002
  • Laatst online: 21-05-2025
igmar: Deze oplossing heeft als nadeel dat de dieper gelegen files/directories niet worden gechmod omdat de parentdirectory nog read-only is als het commando gestart wordt. Je moet het commando dus een paar keer herhalen.

Ik heb het geprobeerd met find . -type d -exec chmod 750 {};, maar dan krijg ik de melding:
code:
1
find: missing argument to `-exec'

Als ik de man page van find lees zou dit toch echt moeten werken.

  • cowgirl
  • Registratie: November 2000
  • Laatst online: 18-12-2025
De ; moet ge-escaped worden en in een ander onderwerp zag ik de { en } ook ge-escaped worden. Je krijgt dan
code:
1
find . -type d -exec chmod 750 \{\} \;

  • phreggle
  • Registratie: Juni 2002
  • Niet online
Sir Isaac schreef op 31 July 2003 @ 13:37:
Ik heb het geprobeerd met find . -type d -exec chmod 750 {};, maar dan krijg ik de melding:
code:
1
find: missing argument to `-exec'

Als ik de man page van find lees zou dit toch echt moeten werken.
Je moet die punt-komma nog escapen, dan werkt het. :)
code:
1
find -type d -exec chmod 750 {} \;

edit: net te laat. :) (Maar de accolades escapen is dus niet perse nodig; mag natuurlijk wel)

[ Voor 11% gewijzigd door phreggle op 31-07-2003 13:42 ]


  • RAMeijer
  • Registratie: Februari 2000
  • Laatst online: 10-02 13:39
Dan vind ik
code:
1
find -type d|xargs chmod 750
er schoner uitzien maar smaken verschillen :)

  • Sendy
  • Registratie: September 2001
  • Niet online
Maar de makkelijkste lijkt me toch wel
code:
1
chmod -R ug+rwX,o-r

Dit is namelijk alles in een (1) keer.

Lees de man page van GNU chmod maar:

[snip]
The letters `rwxXstugo' select the new permissions for the affected
users: read ( r), write (w), execute (or access for directories) (x),
execute only if the file is a directory or already has execute permis-
sion for some user (X), set user or group ID on execution (s), sticky
(t), the permissions granted to the user who owns the file (u), the
permissions granted to other users who are members of the file's group
(g), and the permissions granted to users that are in neither of the
two preceding categories (o).
[/snip]

[ Voor 9% gewijzigd door Sendy op 31-07-2003 13:47 . Reden: Vergat de 'other' bits ]


  • RAMeijer
  • Registratie: Februari 2000
  • Laatst online: 10-02 13:39
Thuissendy schreef op 31 juli 2003 @ 13:45:

execute only if the file is a directory or already has execute permis-
sion for some user (X)
Maar daarmee pak je dus ook executable files in de subdirectories... :)

  • Sendy
  • Registratie: September 2001
  • Niet online
Klopt, maar een executable wil je toch ook executable houden?

  • RAMeijer
  • Registratie: Februari 2000
  • Laatst online: 10-02 13:39
Thuissendy schreef op 31 July 2003 @ 13:51:
Klopt, maar een executable wil je toch ook executable houden?
In principe wel, maar in dit geval niet:
Bijvoorbeeld: na kopieren vanaf een cd zijn alle files 444. De directories moeten naar 750 maar de files naar 640.
Maar goed, alles executables die gekopieerd zijn zijn ook al 444, dus inderdaad:
code:
1
chmod -R ug+rwX,o-r
is het snelste en mooiste in dit geval.

  • Sendy
  • Registratie: September 2001
  • Niet online
:) * Sendy is the best man page reader in the world. (Nou ja, ik begrijp 'find' dan weer niet :p )

  • Sir Isaac
  • Registratie: September 2002
  • Laatst online: 21-05-2025
Mooi die hoofdletter X, die kende ik nog niet.
Ik heb het ook nog geprobeerde met
code:
1
find . -type d -exec chmod 750 {}\;

maar daabij krijg ik nog steeds een foutmelding, ook als ik de { en } escape. De suggestie van cowgirl en phreggle werkt dus niet.

  • phreggle
  • Registratie: Juni 2002
  • Niet online
Sir Isaac schreef op 01 August 2003 @ 10:25:
Mooi die hoofdletter X, die kende ik nog niet.
Ik heb het ook nog geprobeerde met
code:
1
find . -type d -exec chmod 750 {}\;

maar daabij krijg ik nog steeds een foutmelding, ook als ik de { en } escape. De suggestie van cowgirl en phreggle werkt dus niet.
hmm en op welk systeem met welke find versie is dat dan? Ik heb hier GNU find version 4.1.7 onder linux en het werkt prima:
code:
1
2
3
4
5
6
7
8
9
phreggle@anouk:~$ mkdir -p zooi1/zooi2/zooi3/zooi4
phreggle@anouk:~$ cd zooi1/
phreggle@anouk:~/zooi1$ find -type d -exec chmod 750 {} \;
phreggle@anouk:~/zooi1$ find -type d -exec ls -ld {} \;
drwxr-x---    3 phreggle users        4096 Aug  1 11:37 .
drwxr-x---    3 phreggle users        4096 Aug  1 11:37 ./zooi2
drwxr-x---    3 phreggle users        4096 Aug  1 11:37 ./zooi2/zooi3
drwxr-x---    2 phreggle users        4096 Aug  1 11:37 ./zooi2/zooi3/zooi4
phreggle@anouk:~/zooi1$

Toch vaag dan. :)

  • mvdejong
  • Registratie: Juni 2000
  • Laatst online: 29-11-2024

mvdejong

When does the hurting stop ?

Sir Isaac schreef op 01 August 2003 @ 10:25:
Mooi die hoofdletter X, die kende ik nog niet.
Ik heb het ook nog geprobeerde met
code:
1
find . -type d -exec chmod 750 {}\;

maar daabij krijg ik nog steeds een foutmelding, ook als ik de { en } escape. De suggestie van cowgirl en phreggle werkt dus niet.
Er moet een spatie tussen de {} en de \;
De {} is een placeholder voor de door het find-statement gevonden naam van de file/directory/...
De \; is een afsluiter van de bij de -exec-switch behorende parameter (omdat je eventueel meerdere -exec-switches kunt toepassen). Deze moet worden escaped om te voorkomen dat de shell ermee aan de haal gaat voordat het find-commando er iets mee zou willen doen.

The number of things that Arthur couldn't believe he was seeing was fairly large

Pagina: 1