#!/usr/bin/perl -w #Shantz Copy Basket #Created by Shantanu Goel #Project Page: http://tech.shantanugoel.com/projects/misc-stuff/shantz-cp-basket #Tech Site: http://tech.shantanugoel.com #Blog: http://blog.shantanugoel.com #This Program is free for personal/commenrcial use and distribution. But if you use it, please let me know your thoughts etc on the above links or tell your friends or write about it on your site. use strict; use Getopt::Long 'GetOptions'; use AnyDBM_File; my $version = "1.0.0"; my %filelist = (); my $debug = 0; my $list = 0; my $move = 0; my @add_files = (); my @rem_files = (); my @paste_files = (); my @rem_files_id = (); my @paste_files_id = (); sub usage() { print< \$list, 'add|a=s{,}' => \@add_files, 'remove|r=s{,}' => \@rem_files, 'paste|p=s{,}' => \@paste_files, 'debug|d' => \$debug, 'removeid|ri=s{,}' => \@rem_files_id, 'pasteid|pi=s{2,}' => \@paste_files_id, 'move|m' => \$move); if (@ARGV) { print "Invalid args: @ARGV\n"; &usage; } &usage unless $result; if ($debug) { print "Options: \n"; print "list\n" if $list; print "debug\n" if $debug; print "add: @add_files \n" if @add_files; print "remove: ".@rem_files."\n" if @rem_files; print "removeid: ".@rem_files_id."\n" if @rem_files_id; print "paste: ".@paste_files."\n" if @paste_files; print "pasteid: ".@paste_files_id."\n" if @paste_files_id; print "move\n" if $move; } $num_args++ if $list; $num_args++ if $debug; $num_args++ if @add_files; $num_args++ if @rem_files; $num_args++ if @rem_files_id; $num_args++ if $move; if (@paste_files) { $num_args++; $num_args-- if ($move); } if (@paste_files_id) { $num_args++; $num_args-- if ($move); } if ($num_args > 1) { print" Please use only one option at a time (except paste and move combinations)\n"; &usage; } if ($list) { &process_list; } elsif (@add_files) { &process_add; } elsif (@rem_files) { &process_remove; } elsif (@rem_files_id) { &process_remove_id; } elsif (@paste_files) { &process_paste; } elsif (@paste_files_id) { &process_paste_id; } } sub process_list() { my $no_of_files = keys %filelist; print "No of files in basket: $no_of_files\n"; foreach my $key (sort keys %filelist) { print "File ID. $key: $filelist{$key}\n"; } } sub process_add() { use Cwd 'abs_path'; my $no_of_files = keys %filelist; $no_of_files++; my %reverse_filelist = reverse %filelist; foreach my $file (@add_files) { $file = abs_path($file); unless (-e $file) { print " File $file doesn't exist\n"; next; } if (exists $reverse_filelist{$file}) { print " File $file already exists at ID $reverse_filelist{$file}\n"; } else { #find first empty ID in the list foreach my $key (0..$no_of_files) { unless($filelist{$key}) { $filelist{"$key"} = $file; print "Added $file at ID $key\n"; last; } } } } } sub process_remove() { use Cwd 'abs_path'; my $result = -1; foreach my $file (@rem_files) { $file = abs_path($file); foreach my $key (sort keys %filelist) { if ($filelist{$key} eq $file) { $result = $key; last; } } if ($result >= 0) { delete $filelist{$result}; print "Removed $file from basket\n"; } else { print "$file not found in basket\n"; } } } sub process_remove_id() { if ($#rem_files_id == 0 && $rem_files_id[0] eq "all") { %filelist = (); print "Emptied the basket\n"; } else { foreach my $file_id (@rem_files_id) { if ( $filelist{$file_id} ) { print "Removed $filelist{$file_id} from basket\n"; delete $filelist{$file_id}; } else { print " File ID $file_id is not yet taken in basket\n"; } } } } sub process_paste() { print "Not Implemented yet. Is this even needed?\n"; } sub process_paste_id() { use Cwd 'abs_path'; use File::Copy::Recursive qw/rcopy rmove/; my $dest = abs_path($paste_files_id[$#paste_files_id]); $dest .= "/"; pop (@paste_files_id); if ($paste_files_id[0] eq "all") { @paste_files_id = sort keys %filelist; } foreach my $file_id (@paste_files_id) { if ( $filelist{$file_id} ) { if($move) { rmove($filelist{$file_id}, $dest) or die "fail: $!"; print "Moved $filelist{$file_id} to $dest\n"; delete $filelist{$file_id}; } else { rcopy($filelist{$file_id}, $dest) or die "fail: $!"; print "Copied $filelist{$file_id} to $dest\n"; } } else { print " File ID $file_id is not yet taken in basket\n"; } } } sub init() { dbmopen(%filelist, "shantz-cp-db", 0666) or die "can't open shantz-cp-db\n"; } sub deinit() { dbmclose(%filelist); die "\n"; } &init; &process_cmd; &deinit;