![]() |
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.
|
|
google unix.com
|
|||||||
| Forums | Register | Forum Rules | Links | Albums | FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
| UNIX for Dummies Questions & Answers If you're not sure where to post a UNIX or Linux question, post it here. All UNIX and Linux newbies welcome !! |
More UNIX and Linux Forum Topics You Might Find Helpful
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| awk- report generation from input file | McLan | Shell Programming and Scripting | 6 | 03-17-2008 05:34 AM |
| Check backup file size on backup tape | ayhanne | UNIX for Dummies Questions & Answers | 0 | 10-25-2007 12:41 PM |
| Strange difference in file size when copying LARGE file.. | 0ktalmagik | Filesystems, Disks and Memory | 1 | 06-03-2006 08:34 PM |
| How to restrict Core file generation after scp (of SSH) command executed in UNIX | nrsekhar | UNIX for Advanced & Expert Users | 4 | 09-07-2005 03:17 AM |
| Bar code generation in to the text file and printing the same using lp command. | Manjunath Naik | SUN Solaris | 0 | 05-26-2005 03:50 AM |
![]() |
|
|
LinkBack | Thread Tools | Search this Thread | Rate Thread | Display Modes |
|
|
|
||||
|
Hi All,
I've looked through the forum and haven't quite found what I'm looking to do. We're migrating our systems from a midrange to HP-UX, and I'm quite new to UNIX so I'm hoping that I can get pointed in the right direction. What I'm looking to do is save generations of files for recovery backup by tech support. sample Format: ArcSave "filename" "count" So what this would do is take the filename and add a counter to the end, and delete any file >= "count". i.e. Directory holds: subfil.sf, subfil.0001.sf, subfil.0002.sf, subfil.0003.sf, subfil.0004.sf, subfil.0005.sf Run: ArcSave subfil.sf 4 Results: - delete: subfil.0004.sf, subfil.0005.sf (anything >= 0004) - rename: subfil.0003.sf to subfil.0004.sf - rename: subfil.0002.sf to subfil.0003.sf - rename: subfil.0001.sf to subfil.0002.sf - rename: subfil.sf to subfil.0001.sf If a file in the sequence didn't exist we would continue to the next file. ie: subfil.0002.sf was missing Results: - delete: subfil.0004.sf, subfil.0005.sf - rename: subfil.0003.sf to subfil.0004.sf - rename: subfil.0001.sf to subfil.0002.sf - rename: subfil.sf to subfil.0001.sf I want to do a lot of other things as well, but I need a push in the right direction to get started. Thanks, in advance, for all your help! S. Johnson |
|
||||
|
Off the top of my head ...
Do you always have a single dot, and the number should go before that? Code:
#!/usr/bin/perl
use strict;
use warnings;
my ($file, $max) = @ARGV;
my ($base, $ext) = split (/\./, $file);
for my $f (reverse <$base.*.$ext>) {
next unless ($f =~ /\.([0-9]{4})\./);
my $i = $1; # grab number we just matched into $i
if ($i >= $max) {
unlink $f or warn "$0: Could not remove $f: $!\n";
next;
}
# else
my $n = sprintf "%s.%04i.%s", $base, $i+1, $ext;
rename $f, $n or warn "$0: Could not rename $f to $n: $!\n";
}
rename $file, "$base.0001.$ext"
or warn "$0: Could not rename $file to $base.0001.$ext: $!\n";
|
|
||||
|
Hi All,
Thanks for the help so far! I'm trying to figure out how to eliminate the uninitialized value errors in my perl code. When doing the file split: Code:
# Split Filename From Extention my ($base, $ext) = split (/\./, $argFileName); # Check For File Extension $HaveExt = ( ( length $ext ) < 1 ? "Y" : "N" ); "Use of uninitialized value in length at test.pl line 22. For some items I may have 2 files that have the same name one with an extention and one without so I'm checking for the extention and using that later to filter the files. I've tried a bunch of ways to get around this but I always get some form of uninitialized value error. How can I intialize an uninitialized value? I've even tried: Code:
$ext = "" . $ext; Thanks, in advance! |
|
||||
|
Code:
$var ||= ""; Code:
$var = "" unless defined $var; The default can of course be anything, but you indicate you wanted the empty string, so I used that in these examples. The cheapo solution is to take out "use strict" but that's so fraught with peril I'd better not even mention that option. Oops, I already did. |
|
||||
|
On SCO systems it can be done like this:
See (man ADM mount) on other systems. [h2]Versioning filesystems (undelete)[/h2] Versioning allows deleted files to be recovered with the undelete(C) command or on the Desktop as described in ``Deleting and recovering files and directories''. If versioning is enabled on a filesystem, files and directories can be designated for versioning and administered as described in ``Retrieving deleted files''. The versioning feature can be enabled system-wide or for individual filesystems. To enable versioning on all non-root HTFS filesystems:
|
|
||||
|
I just found the "defined" operator? as well?
![]() Now I'm just wondering if using "warn" is the best way to display the output to the command line? Some people here will want to see it and others won't. I know that there is some way of re-directing the "warn"/"die" to an error log in unix, but I can't remember the syntax for it. As per the forums rules: Here's the code that I finished with; we'll be adding other functionality at a later time, but here it is as it stands: Code:
#!/usr/bin/perl
use strict;
use warnings;
# Get The Argument List
my ($argFileName, $argMaxCount) = @ARGV;
# End Run If We Don't Have At Least 2 Arguments
die " - Usage : $0 <FileName> <ArchiveCount>\n" if $#ARGV < 1;
# Check For Valid Arguments
die " - $0: FileName: $argFileName does NOT exist\n" unless ( -e $argFileName );
die " - $0: ArchiveCount: $argMaxCount is less than 1\n" if ( $argMaxCount < 1 );
# Split Filename From Extention
my ($base, $ext) = split (/\./, $argFileName);
# Check For File Extension And Add "."
$ext = ( ( defined $ext ) ? ( "." . $ext ) : "" );
# Rename The Files
&myRename;
# Rename The Subfile Dictionaries As Well
if ( $ext eq ".sf" ) {
warn "\n - Processing Subfile Dictionaries:\n\n";
$ext = ".sfd";
&myRename;
}
# End Processing
exit;
sub myRename
{
# Get File List In Reverse Order
for my $curFile ( reverse <$base*$ext> ) {
# Skip Non-Matching Extentions
my ($curBase, $curExt) = split (/\./, $curFile);
$curExt = ( ( defined $curExt ) ? ( "." . $curExt ) : "" );
next unless $ext eq $curExt;
# Skip Non-Version File Names
next unless ( $curFile =~ /$base\_([0-9]{4})$ext/ );
# Save This Version Number
my $fileVersionNum = $1; # Grab Number We Just Matched Into $fileVersionNum
# Purge All Matching File Versions >= The Max Counter
if ( $fileVersionNum >= $argMaxCount ) {
warn " - Removing - $curFile\n";
unlink $curFile or warn " - $0: Could not remove $curFile: $!\n";
next;
};
# else
my $newFile = ( sprintf "%s_%04i%s", $base, $fileVersionNum+1, $ext );
warn " - Renaming - $curFile -> $newFile\n";
rename $curFile, $newFile or warn " - $0: Could not rename $curFile to $newFile: $!\n";
};
my $oldFile = ( sprintf "%s%s", $base, $ext );
my $newFile = ( sprintf "%s_%04i%s", $base, 1, $ext );
warn " - Renaming - $oldFile -> $newFile\n";
rename ( $oldFile, $newFile ) or warn " - $0: Could not rename $oldFile to $newFile: $!\n";
};
|
|
||||
|
command 2>/dev/null if you don't want to see the error output from command
Might be a useful addition to add a -q option if your users are too young to know where to look for the ">" key. Also it's good to be able to tweak down the verbosity from routine warnings but still notice if there are fatal errors. Actually, looking at your "warnings", I would make them conditional on a -v (verbose) switch instead. They're just diagnostics and if the tool is used even semi-routinely, users will not be reading that output anyway (even when things went wrong). I would keep the $ext (and $curExt etc) without the dot, and add it when it's needed, rather than vice versa. I think it would simplify the code. As another minor design nit, I would make myRename require the extension as a parameter, so you don't mess with global variables within and outside the function. It doesn't really matter here, just basic code hygiene. |
![]() |
| Bookmarks |
| Thread Tools | Search this Thread |
| Display Modes | Rate This Thread |
|
|