1File::Find::Object::RulUes(e3r)Contributed Perl DocumentFaitlieo:n:Find::Object::Rule(3)
2
3
4
6 File::Find::Object::Rule - Alternative interface to File::Find::Object
7
9 version 0.0310
10
12 use File::Find::Object::Rule;
13 # find all the subdirectories of a given directory
14 my @subdirs = File::Find::Object::Rule->directory->in( $directory );
15
16 # find all the .pm files in @INC
17 my @files = File::Find::Object::Rule->file()
18 ->name( '*.pm' )
19 ->in( @INC );
20
21 # as above, but without method chaining
22 my $rule = File::Find::Object::Rule->new;
23 $rule->file;
24 $rule->name( '*.pm' );
25 my @files = $rule->in( @INC );
26
28 File::Find::Object::Rule is a friendlier interface to
29 File::Find::Object . It allows you to build rules which specify the
30 desired files and directories.
31
32 WARNING : This module is a fork of version 0.30 of File::Find::Rule
33 (which has been unmaintained for several years as of February, 2009),
34 and may still have some bugs due to its reliance on File::Find'isms. As
35 such it is considered Alpha software. Please report any problems with
36 File::Find::Object::Rule to its RT CPAN Queue.
37
39 version 0.0310
40
42 "new"
43 A constructor. You need not invoke "new" manually unless you wish
44 to, as each of the rule-making methods will auto-create a suitable
45 object if called as class methods.
46
47 finder
48 The File::Find::Object finder instance itself.
49
50 my @rules = @{$ffor->rules()};
51 The rules to match against. For internal use only.
52
53 Matching Rules
54 "name( @patterns )"
55 Specifies names that should match. May be globs or regular
56 expressions.
57
58 $set->name( '*.mp3', '*.ogg' ); # mp3s or oggs
59 $set->name( qr/\.(mp3|ogg)$/ ); # the same as a regex
60 $set->name( 'foo.bar' ); # just things named foo.bar
61
62 -X tests
63 Synonyms are provided for each of the -X tests. See "-X" in
64 perlfunc for details. None of these methods take arguments.
65
66 Test | Method Test | Method
67 ------|------------- ------|----------------
68 -r | readable -R | r_readable
69 -w | writeable -W | r_writeable
70 -w | writable -W | r_writable
71 -x | executable -X | r_executable
72 -o | owned -O | r_owned
73 | |
74 -e | exists -f | file
75 -z | empty -d | directory
76 -s | nonempty -l | symlink
77 | -p | fifo
78 -u | setuid -S | socket
79 -g | setgid -b | block
80 -k | sticky -c | character
81 | -t | tty
82 -M | modified |
83 -A | accessed -T | ascii
84 -C | changed -B | binary
85
86 Though some tests are fairly meaningless as binary flags
87 ("modified", "accessed", "changed"), they have been included for
88 completeness.
89
90 # find nonempty files
91 $rule->file,
92 ->nonempty;
93
94 stat tests
95 The following "stat" based methods are provided: "dev", "ino",
96 "mode", "nlink", "uid", "gid", "rdev", "size", "atime", "mtime",
97 "ctime", "blksize", and "blocks". See "stat" in perlfunc for
98 details.
99
100 Each of these can take a number of targets, which will follow
101 Number::Compare semantics.
102
103 $rule->size( 7 ); # exactly 7
104 $rule->size( ">7Ki" ); # larger than 7 * 1024 * 1024 bytes
105 $rule->size( ">=7" )
106 ->size( "<=90" ); # between 7 and 90, inclusive
107 $rule->size( 7, 9, 42 ); # 7, 9 or 42
108
109 "any( @rules )"
110 "or( @rules )"
111 Allows shortcircuiting boolean evaluation as an alternative to the
112 default and-like nature of combined rules. "any" and "or" are
113 interchangeable.
114
115 # find avis, movs, things over 200M and empty files
116 $rule->any( File::Find::Object::Rule->name( '*.avi', '*.mov' ),
117 File::Find::Object::Rule->size( '>200M' ),
118 File::Find::Object::Rule->file->empty,
119 );
120
121 "none( @rules )"
122 "not( @rules )"
123 Negates a rule. (The inverse of "any".) "none" and "not" are
124 interchangeable.
125
126 # files that aren't 8.3 safe
127 $rule->file
128 ->not( $rule->new->name( qr/^[^.]{1,8}(\.[^.]{0,3})?$/ ) );
129
130 "prune"
131 Traverse no further. This rule always matches.
132
133 "discard"
134 Don't keep this file. This rule always matches.
135
136 "exec( \&subroutine( $shortname, $path, $fullname ) )"
137 Allows user-defined rules. Your subroutine will be invoked with
138 parameters of the name, the path you're in, and the full relative
139 filename. In addition, $_ is set to the current short name, but
140 its use is discouraged since as opposed to File::Find::Rule,
141 File::Find::Object::Rule does not cd to the containing directory.
142
143 Return a true value if your rule matched.
144
145 # get things with long names
146 $rules->exec( sub { length > 20 } );
147
148 ->grep( @specifiers );
149 Opens a file and tests it each line at a time.
150
151 For each line it evaluates each of the specifiers, stopping at the
152 first successful match. A specifier may be a regular expression or
153 a subroutine. The subroutine will be invoked with the same
154 parameters as an ->exec subroutine.
155
156 It is possible to provide a set of negative specifiers by enclosing
157 them in anonymous arrays. Should a negative specifier match the
158 iteration is aborted and the clause is failed. For example:
159
160 $rule->grep( qr/^#!.*\bperl/, [ sub { 1 } ] );
161
162 Is a passing clause if the first line of a file looks like a perl
163 shebang line.
164
165 "maxdepth( $level )"
166 Descend at most $level (a non-negative integer) levels of
167 directories below the starting point.
168
169 May be invoked many times per rule, but only the most recent value
170 is used.
171
172 "mindepth( $level )"
173 Do not apply any tests at levels less than $level (a non-negative
174 integer).
175
176 "extras( \%extras )"
177 Specifies extra values to pass through to "File::File::find" as
178 part of the options hash.
179
180 For example this allows you to specify following of symlinks like
181 so:
182
183 my $rule = File::Find::Object::Rule->extras({ follow => 1 });
184
185 May be invoked many times per rule, but only the most recent value
186 is used.
187
188 "relative"
189 Trim the leading portion of any path found
190
191 "not_*"
192 Negated version of the rule. An effective shortand related to ! in
193 the procedural interface.
194
195 $foo->not_name('*.pl');
196
197 $foo->not( $foo->new->name('*.pl' ) );
198
199 Query Methods
200 "in( @directories )"
201 Evaluates the rule, returns a list of paths to matching files and
202 directories.
203
204 "start( @directories )"
205 Starts a find across the specified directories. Matching items may
206 then be queried using "match". This allows you to use a rule as an
207 iterator.
208
209 my $rule = File::Find::Object::Rule->file->name("*.jpeg")->start( "/web" );
210 while ( my $image = $rule->match ) {
211 ...
212 }
213
214 "match"
215 Returns the next file which matches, false if there are no more.
216
217 Extensions
218 Extension modules are available from CPAN in the
219 File::Find::Object::Rule namespace. In order to use these extensions
220 either use them directly:
221
222 use File::Find::Object::Rule::ImageSize;
223 use File::Find::Object::Rule::MMagic;
224
225 # now your rules can use the clauses supplied by the ImageSize and
226 # MMagic extension
227
228 or, specify that File::Find::Object::Rule should load them for you:
229
230 use File::Find::Object::Rule qw( :ImageSize :MMagic );
231
232 For notes on implementing your own extensions, consult
233 File::Find::Object::Rule::Extending
234
235 Further examples
236 Finding perl scripts
237 my $finder = File::Find::Object::Rule->or
238 (
239 File::Find::Object::Rule->name( '*.pl' ),
240 File::Find::Object::Rule->exec(
241 sub {
242 if (open my $fh, $_) {
243 my $shebang = <$fh>;
244 close $fh;
245 return $shebang =~ /^#!.*\bperl/;
246 }
247 return 0;
248 } ),
249 );
250
251 Based upon this message
252 http://use.perl.org/comments.pl?sid=7052&cid=10842
253
254 ignore CVS directories
255 my $rule = File::Find::Object::Rule->new;
256 $rule->or($rule->new
257 ->directory
258 ->name('CVS')
259 ->prune
260 ->discard,
261 $rule->new);
262
263 Note here the use of a null rule. Null rules match anything they
264 see, so the effect is to match (and discard) directories called
265 'CVS' or to match anything.
266
268 File::Find::Object::Rule also gives you a procedural interface. This
269 is documented in File::Find::Object::Rule::Procedural
270
272 find
273 rule
275 accessed
276 Corresponds to "-A".
277
278 ascii
279 Corresponds to "-T".
280
281 atime
282 See "stat tests".
283
284 binary
285 Corresponds to "-b".
286
287 blksize
288 See "stat tests".
289
290 block
291 Corresponds to "-b".
292
293 blocks
294 See "stat tests".
295
296 changed
297 Corresponds to "-C".
298
299 character
300 Corresponds to "-c".
301
302 ctime
303 See "stat tests".
304
305 dev
306 See "stat tests".
307
308 directory
309 Corresponds to "-d".
310
311 empty
312 Corresponds to "-z".
313
314 executable
315 Corresponds to "-x".
316
317 exists
318 Corresponds to "-e".
319
320 fifo
321 Corresponds to "-p".
322
323 file
324 Corresponds to "-f".
325
326 gid
327 See "stat tests".
328
329 ino
330 See "stat tests".
331
332 mode
333 See "stat tests".
334
335 modified
336 Corresponds to "-M".
337
338 mtime
339 See "stat tests".
340
341 nlink
342 See "stat tests".
343
344 r_executable
345 Corresponds to "-X".
346
347 r_owned
348 Corresponds to "-O".
349
350 nonempty
351 A predicate that determines if the file is empty. Uses "-s".
352
353 owned
354 Corresponds to "-o".
355
356 r_readable
357 Corresponds to "-R".
358
359 r_writeable
360 r_writable
361 Corresponds to "-W".
362
363 rdev
364 See "stat tests".
365
366 readable
367 Corresponds to "-r".
368
369 setgid
370 Corresponds to "-g".
371
372 setuid
373 Corresponds to "-u".
374
375 size
376 See stat tests.
377
378 socket
379 Corresponds to "-S".
380
381 sticky
382 Corresponds to "-k".
383
384 symlink
385 Corresponds to "-l".
386
387 uid
388 See "stat tests".
389
390 tty
391 Corresponds to "-t".
392
393 writable()
394 Corresponds to "-w".
395
397 The code relies on qr// compiled regexes, therefore this module
398 requires perl version 5.005_03 or newer.
399
400 Currently it isn't possible to remove a clause from a rule object. If
401 this becomes a significant issue it will be addressed.
402
404 Richard Clamp <richardc@unixbeard.net> with input gained from this
405 use.perl discussion: http://use.perl.org/~richardc/journal/6467
406
407 Additional proofreading and input provided by Kake, Greg McCarroll, and
408 Andy Lester andy@petdance.com.
409
410 Ported to use File::Find::Object as File::Find::Object::Rule by Shlomi
411 Fish.
412
414 Copyright (C) 2002, 2003, 2004, 2006 Richard Clamp. All Rights
415 Reserved.
416
417 This module is free software; you can redistribute it and/or modify it
418 under the same terms as Perl itself.
419
421 File::Find::Object, Text::Glob, Number::Compare, find(1)
422
423 If you want to know about the procedural interface, see
424 File::Find::Object::Rule::Procedural, and if you have an idea for a
425 neat extension, see File::Find::Object::Rule::Extending .
426
427 Path::Class::Rule Xs SEE ALSO contains a review of many directory
428 traversal modules on CPAN, including File::Find::Object::Rule and
429 File::Find::Rule (on which this module is based).
430
432 The tests don't run successfully when directly inside an old Subversion
433 checkout, due to the presence of ".svn" directories. "./Build disttest"
434 or "./Build distruntest" run fine.
435
437 · Richard Clamp <richardc@unixbeard.net> with input gained from this
438
439 · and Andy Lester andy@petdance.com.
440
442 This software is copyright (c) 2019 by Richard Clampwith input gained
443 from this.
444
445 This is free software; you can redistribute it and/or modify it under
446 the same terms as the Perl 5 programming language system itself.
447
449 Please report any bugs or feature requests on the bugtracker website
450 <https://github.com/shlomif/file-find-object-rule/issues>
451
452 When submitting a bug or request, please include a test-file or a patch
453 to an existing test-file that illustrates the bug or desired feature.
454
456 Perldoc
457 You can find documentation for this module with the perldoc command.
458
459 perldoc File::Find::Object::Rule
460
461 Websites
462 The following websites have more information about this module, and may
463 be of help to you. As always, in addition to those websites please use
464 your favorite search engine to discover more resources.
465
466 · MetaCPAN
467
468 A modern, open-source CPAN search engine, useful to view POD in
469 HTML format.
470
471 <https://metacpan.org/release/File-Find-Object-Rule>
472
473 · Search CPAN
474
475 The default CPAN search engine, useful to view POD in HTML format.
476
477 <http://search.cpan.org/dist/File-Find-Object-Rule>
478
479 · RT: CPAN's Bug Tracker
480
481 The RT ( Request Tracker ) website is the default bug/issue
482 tracking system for CPAN.
483
484 <https://rt.cpan.org/Public/Dist/Display.html?Name=File-Find-Object-Rule>
485
486 · AnnoCPAN
487
488 The AnnoCPAN is a website that allows community annotations of Perl
489 module documentation.
490
491 <http://annocpan.org/dist/File-Find-Object-Rule>
492
493 · CPAN Ratings
494
495 The CPAN Ratings is a website that allows community ratings and
496 reviews of Perl modules.
497
498 <http://cpanratings.perl.org/d/File-Find-Object-Rule>
499
500 · CPANTS
501
502 The CPANTS is a website that analyzes the Kwalitee ( code metrics )
503 of a distribution.
504
505 <http://cpants.cpanauthors.org/dist/File-Find-Object-Rule>
506
507 · CPAN Testers
508
509 The CPAN Testers is a network of smoke testers who run automated
510 tests on uploaded CPAN distributions.
511
512 <http://www.cpantesters.org/distro/F/File-Find-Object-Rule>
513
514 · CPAN Testers Matrix
515
516 The CPAN Testers Matrix is a website that provides a visual
517 overview of the test results for a distribution on various
518 Perls/platforms.
519
520 <http://matrix.cpantesters.org/?dist=File-Find-Object-Rule>
521
522 · CPAN Testers Dependencies
523
524 The CPAN Testers Dependencies is a website that shows a chart of
525 the test results of all dependencies for a distribution.
526
527 <http://deps.cpantesters.org/?module=File::Find::Object::Rule>
528
529 Bugs / Feature Requests
530 Please report any bugs or feature requests by email to
531 "bug-file-find-object-rule at rt.cpan.org", or through the web
532 interface at
533 <https://rt.cpan.org/Public/Bug/Report.html?Queue=File-Find-Object-Rule>.
534 You will be automatically notified of any progress on the request by
535 the system.
536
537 Source Code
538 The code is open to the world, and available for you to hack on. Please
539 feel free to browse it and play with it, or whatever. If you want to
540 contribute patches, please send me a diff or prod me to pull from your
541 repository :)
542
543 <https://github.com/shlomif/file-find-object-rule>
544
545 git clone http://bitbucket.org/shlomif/perl-file-find-object-rule
546
547
548
549perl v5.28.1 2019-04-06 File::Find::Object::Rule(3)