Bonjour,

en entrée, le contenu du répertoire /log est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
dpi@uvmlsrv01 /log $ find .
.
./lost+found
find: `./lost+found': Permission denied
./controle
./controle/skel_uvmlsrv01.log
./tech
./tech/skel5-fnctl.pl_10829_20160803_154154.log
./tech/skel5-fnctl_10725_20160803_151229.log
./tech/skel5-fnctl_10732_20160803_151345.log
./tech/skel5-fnctl.pl_11021_20160803_164413.log
./tech/skel5-fnctl.pl_11063_20160803_165831.log
./tech/skel5-fnctl_10790_20160803_153108.log
./tech/skel5-fnctl.pl_10862_20160803_155524.log
./tech/skel5-fnctl.pl_11049_20160803_165235.log
./tech/dir1
./tech/dir1/dir11
./tech/dir1/dir11/dir111
./tech/dir1/dir11/dir111/testpto.txt
./tech/skel5-fnctl_10695_20160803_150344.log
./tech/skel5-fnctl.pl_10822_20160803_154101.log
./tech/skel5-fnctl.pl_10929_20160803_160713.log
./tech/skel5-fnctl.pl_11070_20160803_165903.log
./tech/skel5-fnctl_10773_20160803_152717.log
./testpto2.txt
./testpto3.txt
Je souhaite au final lister les fichiers testpto* du répertoire de départ, cad /log, sans descendre dans les sous-répertoire.

Dans un premier temps, je descends dans les sous-répertoires avec le code suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env perl
use strict;
use warnings;
use File::Find::Rule;
use feature 'say';
 
my $dir     = shift;
my $pattern = 'testpto*';
 
my $lf_out = File::Find::Rule->directory
                ->name('lost+found')
                ->prune
                ->discard;
 
my $file_in = File::Find::Rule->file
                ->name($pattern);
 
my @files = File::Find::Rule->or  ( $lf_out, $file_in )
                            ->in  ( $dir );
 
foreach my $f (@files) {
    say $f;
}
sortie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 ./test_file_find_rule.pl /log
/log/testpto3.txt
/log/testpto2.txt
/log/tech/dir1/dir11/dir111/testpto.txt
Maintenant, le problème survient lorsque je ne veux pas descendre dans les sous-répertoires. Mon interprétation est que la règle $recur_out est vraie si maxdepth est supérieur à 1 et est écartée avec le not :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
#!/usr/bin/env perl
use strict;
use warnings;
use File::Find::Rule;
use feature 'say';
 
my $dir     = shift;
my $pattern = 'testpto*';
 
my $lf_out = File::Find::Rule->directory
                ->name('lost+found')
                ->prune
                ->discard;
 
my $recur_out = File::Find::Rule->directory
                ->maxdepth( '>1' );
 
my $file_in = File::Find::Rule->file
                ->name($pattern);
 
my @files = File::Find::Rule->or  ( $lf_out, $file_in )
                            ->not ( $recur_out )
                            ->in  ( $dir );
 
foreach my $f (@files) {
    say $f;
}
sortie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
./test_file_find_rule.pl /log
/log/testpto3.txt
/log/testpto2.txt
/log/tech/dir1/dir11/dir111/testpto.txt