in reply to File::Find with sudo from root

Personally, I'd feel better doing it like this...
use strict; my @dirlist = qw(/dir/to/parse); open( FIND, '-|', 'find', @dirlist, qw/-print0/ ) or die "find: $!"; $/ = chr(0); while (<FIND>) { chomp; print "Processing: $_\n"; }
Depending on what is really supposed to go on inside that while loop, I'd probably add more option flags to the qw// in the open statement (e.g. "-type f" or "-name *.foo" or whatever).

If the job happens to be traversing any relatively large directory tree (esp. when you get up into tens of thousands of files), you'll most likely be doing yourself a favor (in terms of run-time) by avoiding File::Find.

Replies are listed 'Best First'.
Re^2: File::Find with sudo from root
by anotherSmith (Initiate) on Jan 19, 2007 at 17:06 UTC
    I'm not as familar with the "$/ = chr(0);" line. I know it changes the line termintion which I'm assuming is necessary to properly take in the pipe from find. (I haven't had a chance to test difference to see what happens.)

    I did take a quick look in the documentation (http://search.cpan.org/~rgarcia/perl-5.9.4/pod/perlvar.pod) and it seems like it would be a little safer make the change local like:

    #!/usr/bin/perl -w use strict; my @dirlist = qw(/dir/to/parse); open( FIND, '-|', 'find', @dirlist, qw/-print0/ ) or die "find: $!"; { local $/ = chr(0); while (<FIND>) { chomp; print "Processing: $_\n"; } }

    From what I gather form the docs, this will make sure that the $/ change doesn't affect anything else and cause unexpected behavior. PLEASE NOTE, I have not had a chance to test that code, so it may not work in part or whole.

      I'm not as familar with the "$/ = chr(0);" line. I know it changes the line termintion which I'm assuming is necessary to properly take in the pipe from find.

      This is correct. In this example, find gets the -print0 option, which causes it to terminate file names with a null character (chr(0) or "\000") instead of a newline. This is useful because filenames can't contain a null, but they can contain a newline.

      I'd agree also with your use of local to scope the change to $/.