3 votes

Trouver les répertoires ne contenant pas un certain sous-répertoire

Je sais que je peux le faire pour obtenir une liste de répertoires dans /vz/root :

find /vz/root/ -type d -maxdepth 1 -exec echo {} \;

Mais comment puis-je modifier cette liste pour qu'elle ne contienne que les répertoires qui ne contiennent pas un sous-répertoire appelé "php-5.3.3" ? Ainsi, s'il y a 3 répertoires /vz/root/101, /vz/root/102, et /vz/root/103, et que deux d'entre eux contiennent le sous-répertoire php-5.3.3, le chemin de celui qui ne l'a pas sera affiché.

8voto

user9517 Points 113163

Essayez

find /vz/root/ -maxdepth 1 -type d  \! -exec test -d '{}/php-5.3.3' \; -print | grep -v php-5.3.3 | uniq -w 12 | grep -v '^/vz/root/$'

0 votes

Merci. J'ai ajouté maxdepth à votre commande et cela a parfaitement fonctionné. J'obtenais beaucoup d'erreurs sans le maxdepth. find /vz/root/ -maxdepth 1 -type d \ ! -exec test -d '{}/php-5.3.3' -print | grep -v php-5.3.3 | uniq -w 12 | grep -v '^/vz/root/$'

0 votes

Quelle était l'erreur ?

0 votes

Quelque chose comme proc/101 non trouvé, répété avec tous les numéros différents de /vz/root

2voto

Khaled Points 35208

Si vous voulez exclure les chemins qui contiennent php-5.3.3, vous pouvez simplement utiliser grep -v

find /root/ -maxdepth 1 -type d -exec echo {} \; | grep -v php-5.3.3

0 votes

En fait, cela ne fonctionne pas car php-5.3.3 est un sous-répertoire. Je recherche dans /vz/root mais php-5.3.3 est à l'intérieur, par exemple /vz/root/101/php-5.3.3.

0 votes

Je pourrais le faire avec maxdepth 2, mais je devrais alors également exclure tous les autres noms de répertoire qui ne m'intéressent pas. Comment pourrais-je spécifier plusieurs noms avec grep ?

0 votes

"Comment puis-je spécifier plusieurs noms avec grep ?" -- utilisez egrep. Par exemple, egrep -v "(premier_nom|second_nom|troisième_nom)"

1voto

Janne Pikkarainen Points 31244

Vous pouvez utiliser ! comme no opérateur.

find /vz/root/ -type d -maxdepth 1 ! -ipath '*php-5.3.3*' -exec echo {} \;

Cela listera tous les répertoires sous /vz/root/ sauf ceux qui ont php-5.3.3 dans leur nom de chemin.

0 votes

En fait, cela ne fonctionne pas car php-5.3.3 est un sous-répertoire. Je cherche dans /vz/root mais php-5.3.3 est à l'intérieur, par exemple /vz/root/101/php-5.3.3. Si j'exécute cette recherche, elle ne fait que lister tous les répertoires de /vz/root, qu'ils contiennent ou non le sous-répertoire php-5.3.3.

1 votes

Bon sang, tu as raison. Cette pièce est en fait plus difficile à résoudre que je ne le pensais. Il est temps de faire apparaître une poupée vaudou...

0voto

zerolagtime Points 1418

Il est possible de prendre quelque chose qui résout presque le problème en le trouvant et en l'utilisant. find2perl pour créer un programme Perl qui fait la même chose. Puis modifier le script Perl pour faire quelque chose d'avancé. Je n'énumérerai pas cependant parce que vous avez demandé une variation de la fonction find et cela n'entre pas dans le cadre de votre demande. De plus, il faudrait que vous connaissiez un peu de Perl et je ne veux pas déclencher une guerre de mots.

0voto

Jonathan Points 101

Version simplifiée de la réponse acceptée :

find /vz/root/ -type d -maxdepth 1 -exec test ! -d "{}/php-5.3.3" \; -print

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X