Glorf
Février 20, 2016, 11:50
1
Bonjour,
j’ai un problème : j’arrive pas à exclure un répertoire avec find. J’ai trouvé ça en cherchant sur google, mais l’astuce a pas l’air de marcher, mon code :
glorf@debian-desktop:~/test$ find -name "*.php"
./2/2.php
./3/3.php
./1.php
glorf@debian-desktop:~/test$ find -name "*.php" -path '2/' -prune -o -name *.php
./1.php
Là, il m’exclut tous les dossiers … Sachant que c’est pour traiter derrière (avec -exec), je peux pas faire un grep dessus.
Cordialement,
Glorf.
Totor
Février 20, 2016, 11:51
2
Bonjour,
$ mkdir -p php/{hph,phph,aaaa}
$ touch php/{hph,phph,aaaa}/php{1,2,3}.php
$ printf "%s\n" */*/*
php/aaaa/php1.php
php/aaaa/php2.php
php/aaaa/php3.php
php/hph/php1.php
php/hph/php2.php
php/hph/php3.php
php/phph/php1.php
php/phph/php2.php
php/phph/php3.php
$ find . -path './*aaaa' -prune -o -name '*.php' -print
./php/hph/php3.php
./php/hph/php1.php
./php/hph/php2.php
./php/phph/php3.php
./php/phph/php1.php
./php/phph/php2.php
A titre d’info, si tu utilises bash et en particulier une version >=4 :
$ shopt -s extglob globstar
$ mkdir -p php/hph/titi
$ touch php/hph/titi/php5.php
$ printf "%s\n" **/*.php
php/aaaa/php1.php
php/aaaa/php2.php
php/aaaa/php3.php
php/hph/php1.php
php/hph/php2.php
php/hph/php3.php
php/hph/titi/php5.php
php/phph/php1.php
php/phph/php2.php
php/phph/php3.php
$ printf "%s\n" **/!(titi)/*.php
php/aaaa/php1.php
php/aaaa/php2.php
php/aaaa/php3.php
php/hph/php1.php
php/hph/php2.php
php/hph/php3.php
php/phph/php1.php
php/phph/php2.php
php/phph/php3.php
Glorf
Février 20, 2016, 11:51
3
Merci pour l’astuce, par contre je n’arrive pas à exclure plusieurs répertoires :
find . -path './*{Images,yofrankie}' -prune -o -name "*.jpg"
Me sors aussi ce qu’il y a dans Images et yofrankie
Totor
Février 20, 2016, 11:51
4
Les pattern de find ne sont pas identiques à ceux du shell :
$ find . -path './*Images' -prune -o -path './yofrankie' -prune -o -name "*.jpg" -print
# ou
$ find . ! -regex '.*/\(Images\|yofrankie\)/.*' -name '*.jpg'
et il ne faut pas oublier le -print pour la première solution
Glorf
Février 20, 2016, 11:51
5
Merci pour la regex, je note ^^. Mais pourquoi il faut pas mettre le -print ? (ça marche sans chez moi)
Je passe en résolu sinon
Totor
Février 20, 2016, 11:51
6
[quote=« Glorf »]Mais pourquoi il faut pas mettre le -print ? (ça marche sans chez moi)
[/quote]
Cela signifie que si tu ne mets pas -print, l’action par défaut est d’afficher tous les fichiers trouvés.
Ce qui équivaut à ceci :
find . \( -path './*/Images' -prune -o -path './*/yofrankie' -prune -o -name "*.jpg" \) -print
or en mettant -print, tu l’associes uniquement à la dernière condition, c.a.d :
find . \( -path './*/Images' -prune -o -path './*/yofrankie' -prune \) -o \( -name "*.jpg" -print \)
Comme on précise une action, elle n’est réalisée qu’à la condition associée