Salut à tous !
J'aimerais faire un chown -R sur un répertoire en excluant un sous répertoire.
Ex:
[root@WW-NOITST08 miles]# ls -l ./MilesRoot
total 1376
drwxrwxrwx 3 nlaccept nlaccept 12288 sep 19 14:47 batch
drwxrwxrwx 3 nlaccept nlaccept 4096 sep 19 11:39 command
drwxrwxrwx 8 nlaccept nlaccept 4096 sep 4 12:16 milesweb
drwxrwxrwx 3 nlaccept nlaccept 4096 sep 4 12:16 policy
drwxr-xr-x 1 root root 4096 sep 19 14:57 report
--> chown -R --exclude report nlaccept:nlaccept ./MilesRoot
Malheureusement, l'option exclude n'existe pas pour la commande chown.
J'ai donc décidé de passer par un find + grep + xargs
Affichage de l'arborescence: find ./MilesRoot -print --> OK
Affichage de l'arborescence en excluant le dossier voulu: find ./MilesRoot -print | grep -v "report" --> OK
Chown sur le résultat: find ./MilesRoot -print | grep -v "report" | xargs chown nlaccept:nlaccept --> NOK
Cette dernière commande ne marche pas totalement car il me jette sur les fichiers contenant des caractères spéciaux (espaces, -, _, ...).
L'utilisation de -print0 associée à xargs -0 permet de résoudre le problème.
En effet la commande suivante marche correctement avec les fichiers contenant les caractères spéciaux:
find ./MilesRoot -print0 | xargs -0 chown nlaccept:nlaccept
Par contre, j'ai pas réussi à inclure le grep -v dans la chaine:
find ./MilesRoot -print0 | xargs -0 grep -lv "report"
ne fonctionnant pas comme je le voudrais (afficher le nom de tous les fichiers et répertoires sauf le répertoire "report" et ses fichiers)
Résultat, ca marche pas :-)
Une idée ? Sûrement ma syntaxe mais bon ...
Merci d'avance.
# Juste find.
Posté par Obsidian . Évalué à 4.
M'enfin bon, si c'est juste pour un seul répertoire et si ce n'est à faire qu'une seule fois, tu as plus vite fait de faire un chmod 000 sur ledit répertoire, lancer ton chown et restaurer les droit du répertoire ensuite.
[^] # Re: Juste find.
Posté par chboeuf . Évalué à 1.
La commande fonctionne bien mais si j'ai une arborescence dans report, l'arborescence subira le chown.
Résultat, obligé de faire un
find ./MilesRoot -not -regex '^./MilesRoot/report*.*.*' -exec chown nlaccept:nlaccept {} \;
Si je veux exclure 3 niveaux hiérarchiques du répertoire report. Et comme je ne peux savoir à l'avance la "profondeur" de ce répertoire, y a t'il moyen de rendre ca dynamique ?
Merci d'avance
[^] # Re: Juste find.
Posté par Obsidian . Évalué à 2.
Attention ! C'est une expression régulière, pas une globale shell !
Je viens d'essayer de mon côté, ça fonctionne très bien. Soit tu as mal écrit l'expression (celle que tu as écrite dans ce commentaire reconnaîtrait « repor », « report », « reporttttttt », tous suivis de n'importe quel motif), soit find est mis en défaut par les problèmes d'encodage des noms de fichiers (entre UTF-8 et ISO-8859-15, par exemple). J'ai le problème sur une Ubuntu Dapper.
[^] # Re: Juste find.
Posté par chboeuf . Évalué à 1.
Tout est en root:
[root@ww-noitst15 miles]# ls -la
drwxr-xr-x 4 root root 4096 sep 24 10:02 .
drwxr-xr-x 4 root root 4096 sep 24 10:02 ..
-rw-r--r-- 1 root root 191881 sep 24 10:02 jaxen-full.jar
-rw-r--r-- 1 root root 147698 sep 24 10:02 jdom.jar
-rwxr-x--- 1 root root 21629 sep 24 10:02 local.properties
-rw-r--r-- 1 root root 1739 sep 24 10:00 log4j.properties
drwxr-xr-x 13 root root 4096 sep 24 10:02 MilesRoot
-rwxr-xr-x 1 root root 1352918 sep 24 10:02 ojdbc14.jar
Passage de la commande. MilesRoot a changé de propriétaire.
[root@ww-noitst15 miles]# find ./MilesRoot -not -regex '^./MilesRoot/report*' -exec chown exploit:dba {} \;
[root@ww-noitst15 miles]# ls -la
total 5528
drwxr-xr-x 4 root root 4096 sep 24 10:02 .
drwxr-xr-x 4 root root 4096 sep 24 10:02 ..
-rw-r--r-- 1 root root 191881 sep 24 10:02 jaxen-full.jar
-rw-r--r-- 1 root root 147698 sep 24 10:02 jdom.jar
-rwxr-x--- 1 root root 21629 sep 24 10:02 local.properties
-rw-r--r-- 1 root root 1739 sep 24 10:00 log4j.properties
drwxr-xr-x 13 exploit dba 4096 sep 24 10:02 MilesRoot
-rwxr-xr-x 1 root root 1352918 sep 24 10:02 ojdbc14.jar
Le répertoire report n'a pas subit le chown --> normal
[root@ww-noitst15 miles]# cd MilesRoot/
[root@ww-noitst15 MilesRoot]# ls -la
drwxr-xr-x 13 exploit dba 4096 sep 24 10:02 .
drwxr-xr-x 4 root root 4096 sep 24 10:02 ..
drwxr-xr-x 5 exploit dba 4096 sep 24 10:00 batch
drwxr-xr-x 3 exploit dba 4096 sep 24 10:00 command
drwxr-xr-x 95 exploit dba 16384 sep 24 10:02 connectors
drwxr-xr-x 7 exploit dba 102400 sep 24 10:00 documents
drwxr-xr-x 5 exploit dba 4096 sep 24 10:00 milesweb
drwxr-xr-x 3 exploit dba 4096 sep 24 10:02 policy
drwxr-x--- 3 root root 4096 sep 24 10:02 report
drwxr-xr-x 2 exploit dba 4096 sep 24 10:00 schema
-rwxr-xr-x 1 exploit dba 3990100 sep 24 10:00 userStatistics.csv
Son contenu a subit le changement.
[root@ww-noitst15 report]# ls -la
drwxr-x--- 3 root root 4096 sep 24 10:02 .
drwxr-xr-x 13 exploit dba 4096 sep 24 10:02 ..
drwxr-x--- 2 exploit dba 4096 sep 24 10:02 2007_06
-rwxr-x--- 1 exploit dba 0 sep 24 10:02 test.log
Je tourne sur une Red Hat ES 4.
[^] # Re: Juste find.
Posté par chboeuf . Évalué à 0.
Tout est en root:
[root@ww-noitst15 miles]# ls -la
drwxr-xr-x 4 root root 4096 sep 24 10:02 .
drwxr-xr-x 4 root root 4096 sep 24 10:02 ..
-rw-r--r-- 1 root root 191881 sep 24 10:02 jaxen-full.jar
-rw-r--r-- 1 root root 147698 sep 24 10:02 jdom.jar
-rwxr-x--- 1 root root 21629 sep 24 10:02 local.properties
-rw-r--r-- 1 root root 1739 sep 24 10:00 log4j.properties
drwxr-xr-x 13 root root 4096 sep 24 10:02 MilesRoot
-rwxr-xr-x 1 root root 1352918 sep 24 10:02 ojdbc14.jar
Passage de la commande. MilesRoot a changé de propriétaire.
[root@ww-noitst15 miles]# find ./MilesRoot -not -regex '^./MilesRoot/report*' -exec chown exploit:dba {} \;
[root@ww-noitst15 miles]# ls -la
drwxr-xr-x 4 root root 4096 sep 24 10:02 .
drwxr-xr-x 4 root root 4096 sep 24 10:02 ..
-rw-r--r-- 1 root root 191881 sep 24 10:02 jaxen-full.jar
-rw-r--r-- 1 root root 147698 sep 24 10:02 jdom.jar
-rwxr-x--- 1 root root 21629 sep 24 10:02 local.properties
-rw-r--r-- 1 root root 1739 sep 24 10:00 log4j.properties
drwxr-xr-x 13 exploit dba 4096 sep 24 10:02 MilesRoot
-rwxr-xr-x 1 root root 1352918 sep 24 10:02 ojdbc14.jar
Le répertoire report n'a pas subit le chown --> normal
[root@ww-noitst15 miles]# cd MilesRoot/
[root@ww-noitst15 MilesRoot]# ls -la
drwxr-xr-x 13 exploit dba 4096 sep 24 10:02 .
drwxr-xr-x 4 root root 4096 sep 24 10:02 ..
drwxr-xr-x 5 exploit dba 4096 sep 24 10:00 batch
drwxr-xr-x 3 exploit dba 4096 sep 24 10:00 command
drwxr-xr-x 95 exploit dba 16384 sep 24 10:02 connectors
drwxr-xr-x 7 exploit dba 102400 sep 24 10:00 documents
drwxr-xr-x 5 exploit dba 4096 sep 24 10:00 milesweb
drwxr-xr-x 3 exploit dba 4096 sep 24 10:02 policy
drwxr-x--- 3 root root 4096 sep 24 10:02 report
drwxr-xr-x 2 exploit dba 4096 sep 24 10:00 schema
-rwxr-xr-x 1 exploit dba 3990100 sep 24 10:00 userStatistics.csv
Son contenu a subit le changement.
[root@ww-noitst15 report]# ls -la
drwxr-x--- 3 root root 4096 sep 24 10:02 .
drwxr-xr-x 13 exploit dba 4096 sep 24 10:02 ..
drwxr-x--- 2 exploit dba 4096 sep 24 10:02 2007_06
-rwxr-x--- 1 exploit dba 0 sep 24 10:02 test.log
Je tourne sur une Red Hat ES 4.
# Re: chown récursif avec exclusion de répertoire
Posté par netsurfeur . Évalué à 1.
chown -R nlaccept:nlaccept MilesRoot/[!r]*
[^] # Re: chown récursif avec exclusion de répertoire
Posté par chboeuf . Évalué à 1.
La commande ne marche pas correctement car je peux avoir d'autres répertoires dont le nom commence par la lettre "r".
Mais tu ne pouvais pas le savoir, je ne l'ai pas précisé.
Merci en tout cas.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.