in reply to Reading every file in a directory

how do you assign those files within the directory (all of which are the same format) to be opened so the timestamp may be read ?

files directory -> How to read files in a directory, directory path to be given through CMD, How to find & list 0 byte files in a directory ... opendir,readdir,File::Find, File::Find::Rule

my $rule = File::Find::Rule->file->name("*.jpeg")->maxdepth(1)->start( + "/web" ); while ( defined ( my $image = $rule->match ) ) { ... }

Its covered in many a free tutorial and free book http://perl-tutorial.org/, The Perl Monks Guide to the Monastery

Replies are listed 'Best First'.
Re^2: Reading every file in a directory
by spookyjack123 (Initiate) on Sep 29, 2012 at 01:35 UTC

    Every file is the same format (.yml) as well as the same format, I need a system like a glob that is super light for the job, and short. one that opens all files in the directory regardless of format type, just something where a directory is assigned, and it opens the files. Would this serve that, or is there an even simpler method ?

      Here's an option:

      use strict; use warnings; my $directory = '.'; for my $YMLfile (<"$directory/*.yml">) { open my $fh, '<', $YMLfile or die $!; while (<$fh>) { # process the file's contents } close $fh; }

      Update: Perhaps I've misunderstood your issue. In one place you say that you want the files "...to be opened so the timestamp may be read...," as if the timestamp may be a string within the file. Yet, at the beginning, you mention a script that can "...check the age of over 20,000 YML files..." In the latter case files are not opened. If it's the latter case, the following may assist you:

      use strict; use warnings; use File::stat; my $directory = '.'; my $currentTime = time; for my $YMLfile (<"$directory/*.yml">) { my $mtime = stat($YMLfile)->mtime; print "$YMLfile: " . ( $currentTime - $mtime ) . " seconds old\n"; }

      You can also try the -M operator on the files, which returns the file's age in days:

      for my $YMLfile (<"$directory/*.yml">) { print -M $YMLfile, "\n"; }

      And the following PM node may be helpful: How do I find and delete files based on age?.

      I strongly suggest running your file-deleting script on a practice directory.

        Oh 1 note I just discovered, I believe the sample here that you posted:

        use strict; use warnings; my $directory = '.'; for my $YMLfile (<"$directory/*.yml">) { open my $fh, '<', $YMLfile or die $!; while (<$fh>) { # process the file's contents } close $fh; }

        That code is good for opening the directory, I'm super grateful :) ! now reading and parsing the files is the next main issue for this script, the login line in the comment I last posted needs to be assigned to a value that can be read, then the login: followed by a space, need to be removed so it only shows the timestamp (the parsing part) then comparing will be super easy. Any ideas there ?

        Sorry about my vagueness, that code helps, but let me explain more, I'm totally lost as a noob. basically, there is 20,000 or so .yml files in the directory /home/gac3/plugins/Essentials/userdata/ these files contain a line labled login, that record the last login of a user, I need to take that timestamp, compare it to the current time, minus 5 days, so if the origin file has a user which has not logged in after 5 days, the .yml file is deleted. here is an example yml file.

        timestamps: login: 1348876288937 logout: 1348876601161 lastteleport: 1348876478686 ipAddress: 192.168.1.1 lastlocation: world: Main_Flat2 x: -10.627933608068007 y: 38.9038268486379 z: -20.417177146511058 yaw: -192.60002 pitch: 24.150005 nickname: §lJack powertools: {} afk: false money: 0.0 homes: gf: world: Main_Flat x: -81.00634258469903 y: 50.0 z: 80.56448372272854 yaw: 238.24374 pitch: 78.49189

        That line labled login, is what needs to be read, the script needs to read that line in every single file in the directory, all of which are the same format, and have that as a value which can then be compared. Any ideas ?

      Would this serve that, or is there an even simpler method ?

      You tell me? Try It To See?