Date: Fri, 5 May 2023 08:51:37 +0100 From: Kaya Saman <kayasaman@optiplex-networks.com> To: Paul Procacci <pprocacci@gmail.com> Cc: freebsd-questions@freebsd.org Subject: Re: Tool to compare directories and delete duplicate files from one directory Message-ID: <f226ca70-4cd2-b473-d90c-493d1640070c@optiplex-networks.com> In-Reply-To: <CAFbbPug8npwyxjzxB20wV%2BmHpqovoCwPyx1p89GRSKDWhA_qcQ@mail.gmail.com> References: <9887a438-95e7-87cc-a162-4ad7a70d744f@optiplex-networks.com> <CAFbbPugfhXGPfscKpx6B0ue=DcF_qssL6P-0GgB1CWKtm3U=tQ@mail.gmail.com> <344b29c6-3d69-543d-678d-c2433dbf7152@optiplex-networks.com> <CAFbbPuiNqYLLg8wcg8S_3=y46osb06%2BduHqY9f0n=OuRgGVY=w@mail.gmail.com> <ef0328b0-caab-b6a2-5b33-1ab069a07f80@optiplex-networks.com> <CAFbbPujUALOS%2BsUxsp=54vxVAHe_jkvi3d-CksK78c7rxAVoNg@mail.gmail.com> <7747f587-f33e-f39c-ac97-fe4fe19e0b76@optiplex-networks.com> <CAFbbPuhoMOM=wp26yZ42e9xnRP%2BtJ6B30y8%2BBa3eCBh2v66Grw@mail.gmail.com> <fd9aa7d3-f6a7-2274-f970-d4421d187855@optiplex-networks.com> <CAFbbPujpPPrm-axMC9S5OnOiYn2oPuQbkRjnQY4tp=5L7TiVSg@mail.gmail.com> <eda13374-48c1-1749-3a73-530370934eff@optiplex-networks.com> <CAFbbPujbyPHm2GO%2BFnR0G8rnsmpA3AxY2NzYOAAXetApiF8HVg@mail.gmail.com> <b4ac4aea-a051-fbfe-f860-cd7836e5a1bb@optiplex-networks.com> <CAFbbPug8npwyxjzxB20wV%2BmHpqovoCwPyx1p89GRSKDWhA_qcQ@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --------------SiM7Cf9U9LS10HeJGopQNN7n Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Paul, that's fantastic!! Thank you so much! It works!! Now to test on the live system... guess I should take a zfs snapshot=20 before messing around with things :-) I really appreciate this :-D Best regards, Kaya On 5/5/23 08:01, Paul Procacci wrote: > > > > On Fri, May 5, 2023 at 12:06=E2=80=AFAM Kaya Saman=20 > <kayasaman@optiplex-networks.com> wrote: > > > On 5/5/23 04:36, Paul Procacci wrote: > > #!/usr/bin/env perl > > > > use strict; > > use warnings; > > > > sub msgDie > > { > > =C2=A0 my ($ret) =3D shift; > > =C2=A0 my ($msg) =3D shift // "$0 dir_base dir\n"; > > =C2=A0 print $msg; > > =C2=A0 exit($ret); > > } > > > > msgDie(1) unless(scalar @ARGV eq 2); > > > > my $base =3D $ARGV[0]; > > my $dir =C2=A0=3D $ARGV[1]; > > > > msgDie(1, "base directory doesn't exist\n") unless -d $base; > > msgDie(1, "source directory doesn't exist\n") unless -d $dir; > > > > opendir(my $dh, $dir) or msgDie("Unable to open directory: $dir\n= "); > > while(readdir $dh) > > { > > =C2=A0 next if($_ eq '.' || $_ eq '..'); > > =C2=A0 next if(! -f "$base/$_"); > > > > =C2=A0 my ($ref) =3D (stat("$base/$_"))[7]; > > =C2=A0 my ($src) =3D (stat("$dir/$_"))[7]; > > =C2=A0 unlink("$dir/$_") if($ref =3D=3D $src); > > } > > > To start with this is the directory structure: > > > =C2=A0=C2=A0ls -lhR /tmp/test1 > total 1 > drwxr-xr-x=C2=A0 2 root=C2=A0 wheel=C2=A0=C2=A0=C2=A0=C2=A0 3B May=C2= =A0 5 04:57 dupdir1 > drwxr-xr-x=C2=A0 2 root=C2=A0 wheel=C2=A0=C2=A0=C2=A0=C2=A0 3B May=C2= =A0 5 04:57 dupdir2 > > /tmp/test1/dupdir1: > total 1 > -rw-r--r--=C2=A0 1 root=C2=A0 wheel=C2=A0=C2=A0=C2=A0=C2=A0 8B Apr = 30 03:17 dup > > /tmp/test1/dupdir2: > total 1 > -rw-r--r--=C2=A0 1 root=C2=A0 wheel=C2=A0=C2=A0=C2=A0=C2=A0 7B May=C2= =A0 5 03:23 dup1 > > > ls -lhR /tmp/test2 > total 1 > drwxr-xr-x=C2=A0 2 root=C2=A0 wheel=C2=A0=C2=A0=C2=A0=C2=A0 3B May=C2= =A0 5 04:56 dupdir1 > drwxr-xr-x=C2=A0 2 root=C2=A0 wheel=C2=A0=C2=A0=C2=A0=C2=A0 3B May=C2= =A0 5 04:56 dupdir2 > > /tmp/test2/dupdir1: > total 1 > -rw-r--r--=C2=A0 1 root=C2=A0 wheel=C2=A0=C2=A0=C2=A0=C2=A0 4B Apr = 30 02:53 dup > > /tmp/test2/dupdir2: > total 1 > -rw-r--r--=C2=A0 1 root=C2=A0 wheel=C2=A0=C2=A0=C2=A0=C2=A0 7B Apr = 30 02:47 dup1 > > > So what I want to happen is the script to recurse from the top leve= l > directories test1 and test2 then expected behavior should be to > remove > file dup1 as dup is different between directories. > > > I ran the script and again it didn't produce any output? > > ./test.pl <http://test.pl> /tmp/test1 /tmp/test2 > > > I'm not sure if I need any other perl module? It is installed: > > p5-ExtUtils-Config-0.008_1=C2=A0=C2=A0=C2=A0=C2=A0 Wrapper for perl= configuration > perl5-5.32.1_3=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Practical Extraction and Repor= t > Language > > > I have many p5- modules too installed but maybe I don't have the > right > ones to run the script? > > > > > - My script doesn't have any output. > - My script doesn't recurse directories. > - My script requires no modules. > - You just need perl5 installed. > > So you want something like this: > > % find test* -type f -ls > 131318 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rwxr-xr-x =C2=A0 =C2=A01 pprocacci= =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=20 > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 763 May =C2=A05 06:58 test.pl= <http://test.pl> > 132503 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rw-r--r-- =C2=A0 =C2=A01 pprocacci= =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=20 > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 5 May =C2=A05 06:52 te= st1/dupdir2/dup1 > 132898 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rw-r--r-- =C2=A0 =C2=A01 pprocacci= =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=20 > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 8 May =C2=A05 06:51 te= st1/dupdir1/dup > 132771 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rw-r--r-- =C2=A0 =C2=A01 pprocacci= =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=20 > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 4 May =C2=A05 06:52 te= st2/dupdir1/dup > 133006 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rw-r--r-- =C2=A0 =C2=A01 pprocacci= =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=20 > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 5 May =C2=A05 06:52 te= st2/dupdir2/dup1 > > And after the run of the perl script like so: > % ./test.pl <http://test.pl> test1 test2 > > You want it to be like this: > > % find test* -type f -ls > 131318 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rwxr-xr-x =C2=A0 =C2=A01 pprocacci= =C2=A0 =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=20 > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 763 May =C2=A05 06:58 = test.pl <http://test.pl> > 132503 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rw-r--r-- =C2=A0 =C2=A01 pprocacci= =C2=A0 =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=20 > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 5 May =C2=A05 0= 6:52 test1/dupdir2/dup1 > 132898 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rw-r--r-- =C2=A0 =C2=A01 pprocacci= =C2=A0 =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=20 > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 8 May =C2=A05 0= 6:51 test1/dupdir1/dup > 132771 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rw-r--r-- =C2=A0 =C2=A01 pprocacci= =C2=A0 =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=20 > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 4 May =C2=A05 0= 6:52 test2/dupdir1/dup > > If so: > > #################################################### > #!/usr/bin/env perl > > use strict; > use warnings; > > sub msgDie > { > =C2=A0 my ($ret) =3D shift; > =C2=A0 my ($msg) =3D shift // "$0 dir_base dir\n"; > =C2=A0 print $msg; > =C2=A0 exit($ret); > } > > sub doit > { > =C2=A0 my($base, $cur) =3D @_; > > =C2=A0 opendir(my $dh, $cur) or msgDie("Unable to open directory: $cur\= n"); > =C2=A0 while(readdir $dh) > =C2=A0 { > =C2=A0 =C2=A0 next if($_ eq '.' || $_ eq '..'); > =C2=A0 =C2=A0 if(-d "$cur/$_"){ doit("$base/$_", "$cur/$_"); next; } > =C2=A0 =C2=A0 next if(! -f "$base/$_"); > > =C2=A0 =C2=A0 my ($ref) =3D (stat("$base/$_"))[7]; > =C2=A0 =C2=A0 my ($src) =3D (stat("$cur/$_"))[7]; > =C2=A0 =C2=A0 unlink("$cur/$_") if($ref =3D=3D $src); > =C2=A0 } > } > > msgDie(1) unless(scalar @ARGV eq 2); > > my $base =3D $ARGV[0]; > my $dir =C2=A0=3D $ARGV[1]; > > msgDie(1, "base diretory doesn't exist\n") unless -d $base; > msgDie(1, "source diretory doesn't exist\n") unless -d $dir; > > doit($base, $dir); > #################################################### > > ~Paul > > --=20 > __________________ > > :(){ :|:& };: --------------SiM7Cf9U9LS10HeJGopQNN7n Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <html> <head> <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3DUTF= -8"> </head> <body> <p>Paul, that's fantastic!! Thank you so much!</p> <p>It works!!</p> <p><br> </p> <p>Now to test on the live system... guess I should take a zfs snapshot before messing around with things :-)</p> <p><br> </p> <p>I really appreciate this :-D<br> </p> <p><br> </p> <p>Best regards,</p> <p><br> </p> <p>Kaya<br> </p> <p><br> </p> <div class=3D"moz-cite-prefix">On 5/5/23 08:01, Paul Procacci wrote:<= br> </div> <blockquote type=3D"cite" cite=3D"mid:CAFbbPug8npwyxjzxB20wV+mHpqovoCwPyx1p89GRSKDWhA_qcQ@mail.gmai= l.com"> <meta http-equiv=3D"content-type" content=3D"text/html; charset=3DU= TF-8"> <div dir=3D"ltr"> <div> <div dir=3D"ltr"><br> <div><br> </div> </div> <br> <div class=3D"gmail_quote"> <div dir=3D"ltr" class=3D"gmail_attr">On Fri, May 5, 2023 at 12:06=E2=80=AFAM Kaya Saman <<a href=3D"mailto:kayasaman@optiplex-networks.com" moz-do-not-send=3D"true" class=3D"moz-txt-link-freetext">= kayasaman@optiplex-networks.com</a>> wrote:<br> </div> <blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br> On 5/5/23 04:36, Paul Procacci wrote:<br> > #!/usr/bin/env perl<br> ><br> > use strict;<br> > use warnings;<br> ><br> > sub msgDie<br> > {<br> > =C2=A0 my ($ret) =3D shift;<br> > =C2=A0 my ($msg) =3D shift // "$0 dir_base dir\n";<br> > =C2=A0 print $msg;<br> > =C2=A0 exit($ret);<br> > }<br> ><br> > msgDie(1) unless(scalar @ARGV eq 2);<br> ><br> > my $base =3D $ARGV[0];<br> > my $dir =C2=A0=3D $ARGV[1];<br> ><br> > msgDie(1, "base directory doesn't exist\n") unless -d $base;<br> > msgDie(1, "source directory doesn't exist\n") unless -d $dir;<br> ><br> > opendir(my $dh, $dir) or msgDie("Unable to open directory: $dir\n");<br> > while(readdir $dh)<br> > {<br> > =C2=A0 next if($_ eq '.' || $_ eq '..');<br> > =C2=A0 next if(! -f "$base/$_");<br> ><br> > =C2=A0 my ($ref) =3D (stat("$base/$_"))[7];<br> > =C2=A0 my ($src) =3D (stat("$dir/$_"))[7];<br> > =C2=A0 unlink("$dir/$_") if($ref =3D=3D $src);<br> > }<br> <br> <br> To start with this is the directory structure:<br> <br> <br> =C2=A0=C2=A0ls -lhR /tmp/test1<br> total 1<br> drwxr-xr-x=C2=A0 2 root=C2=A0 wheel=C2=A0=C2=A0=C2=A0=C2=A0= 3B May=C2=A0 5 04:57 dupdir1<br> drwxr-xr-x=C2=A0 2 root=C2=A0 wheel=C2=A0=C2=A0=C2=A0=C2=A0= 3B May=C2=A0 5 04:57 dupdir2<br> <br> /tmp/test1/dupdir1:<br> total 1<br> -rw-r--r--=C2=A0 1 root=C2=A0 wheel=C2=A0=C2=A0=C2=A0=C2=A0= 8B Apr 30 03:17 dup<br> <br> /tmp/test1/dupdir2:<br> total 1<br> -rw-r--r--=C2=A0 1 root=C2=A0 wheel=C2=A0=C2=A0=C2=A0=C2=A0= 7B May=C2=A0 5 03:23 dup1<br> <br> <br> ls -lhR /tmp/test2<br> total 1<br> drwxr-xr-x=C2=A0 2 root=C2=A0 wheel=C2=A0=C2=A0=C2=A0=C2=A0= 3B May=C2=A0 5 04:56 dupdir1<br> drwxr-xr-x=C2=A0 2 root=C2=A0 wheel=C2=A0=C2=A0=C2=A0=C2=A0= 3B May=C2=A0 5 04:56 dupdir2<br> <br> /tmp/test2/dupdir1:<br> total 1<br> -rw-r--r--=C2=A0 1 root=C2=A0 wheel=C2=A0=C2=A0=C2=A0=C2=A0= 4B Apr 30 02:53 dup<br> <br> /tmp/test2/dupdir2:<br> total 1<br> -rw-r--r--=C2=A0 1 root=C2=A0 wheel=C2=A0=C2=A0=C2=A0=C2=A0= 7B Apr 30 02:47 dup1<br> <br> <br> So what I want to happen is the script to recurse from the top level <br> directories test1 and test2 then expected behavior should be to remove <br> file dup1 as dup is different between directories.<br> <br> <br> I ran the script and again it didn't produce any output?<br= > <br> ./<a href=3D"http://test.pl" rel=3D"noreferrer" target=3D"_blank" moz-do-not-send=3D"true">test.pl</a> /tmp/test1 /tmp/test2<br> <br> <br> I'm not sure if I need any other perl module? It is installed:<br> <br> p5-ExtUtils-Config-0.008_1=C2=A0=C2=A0=C2=A0=C2=A0 Wrapper = for perl configuration<br> perl5-5.32.1_3=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Practical Extraction = and Report Language<br> <br> <br> I have many p5- modules too installed but maybe I don't have the right <br> ones to run the script?<br> <br> <br> </blockquote> </div> <br> <br clear=3D"all"> <div>- My script doesn't have any output.<br> - My script doesn't recurse directories. <br> - My script requires no modules. </div> <div>- You just need perl5 installed.<br> </div> <br> </div> So you want something like this:<br> <div><br> % find test* -type f -ls<br> 131318 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rwxr-xr-x =C2=A0 =C2=A01 p= procacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 763 May =C2=A05 = 06:58 <a href=3D"http://test.pl" moz-do-not-send=3D"true">test.pl</a><= br> 132503 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rw-r--r-- =C2=A0 =C2=A01 p= procacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 5 May =C2= =A05 06:52 test1/dupdir2/dup1<br> 132898 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rw-r--r-- =C2=A0 =C2=A01 p= procacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 8 May =C2= =A05 06:51 test1/dupdir1/dup<br> 132771 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rw-r--r-- =C2=A0 =C2=A01 p= procacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 4 May =C2= =A05 06:52 test2/dupdir1/dup<br> 133006 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rw-r--r-- =C2=A0 =C2=A01 p= procacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 5 May =C2= =A05 06:52 test2/dupdir2/dup1<br> <div><br> And after the run of the perl script like so:<br> % ./<a href=3D"http://test.pl" moz-do-not-send=3D"true">test.= pl</a> test1 test2<br> <br> You want it to be like this:<br> <br> % find test* -type f -ls<br> 131318 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rwxr-xr-x =C2=A0 =C2=A01= pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 763 Ma= y =C2=A05 06:58 <a href=3D"http://test.pl" moz-do-not-send=3D"true">test.pl</= a><br> 132503 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rw-r--r-- =C2=A0 =C2=A01= pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= 5 May =C2=A05 06:52 test1/dupdir2/dup1<br> 132898 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rw-r--r-- =C2=A0 =C2=A01= pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= 8 May =C2=A05 06:51 test1/dupdir1/dup<br> 132771 =C2=A0 =C2=A0 =C2=A0 =C2=A09 -rw-r--r-- =C2=A0 =C2=A01= pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pprocacci =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= 4 May =C2=A05 06:52 test2/dupdir1/dup<br> <br> </div> <div>If so:<br> <br> #################################################### <br> #!/usr/bin/env perl<br> <br> use strict;<br> use warnings;<br> <br> sub msgDie<br> {<br> =C2=A0 my ($ret) =3D shift;<br> =C2=A0 my ($msg) =3D shift // "$0 dir_base dir\n";<br> =C2=A0 print $msg;<br> =C2=A0 exit($ret);<br> }<br> <br> sub doit<br> {<br> =C2=A0 my($base, $cur) =3D @_;<br> <br> =C2=A0 opendir(my $dh, $cur) or msgDie("Unable to open direct= ory: $cur\n");<br> =C2=A0 while(readdir $dh)<br> =C2=A0 {<br> =C2=A0 =C2=A0 next if($_ eq '.' || $_ eq '..');<br> =C2=A0 =C2=A0 if(-d "$cur/$_"){ doit("$base/$_", "$cur/$_"); = next; }<br> =C2=A0 =C2=A0 next if(! -f "$base/$_");<br> <br> =C2=A0 =C2=A0 my ($ref) =3D (stat("$base/$_"))[7];<br> =C2=A0 =C2=A0 my ($src) =3D (stat("$cur/$_"))[7];<br> =C2=A0 =C2=A0 unlink("$cur/$_") if($ref =3D=3D $src);<br> =C2=A0 }<br> }<br> <br> msgDie(1) unless(scalar @ARGV eq 2);<br> <br> my $base =3D $ARGV[0];<br> my $dir =C2=A0=3D $ARGV[1];<br> <br> msgDie(1, "base diretory doesn't exist\n") unless -d $base;<b= r> msgDie(1, "source diretory doesn't exist\n") unless -d $dir;<= br> <br> doit($base, $dir);<br> ####################################################<br> <br> </div> <div>~Paul<br> </div> <div><br> <span class=3D"gmail_signature_prefix">-- </span><br> <div dir=3D"ltr" class=3D"gmail_signature">__________________= <br> <br> :(){ :|:& };:</div> </div> </div> </div> </blockquote> </body> </html> --------------SiM7Cf9U9LS10HeJGopQNN7n--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?f226ca70-4cd2-b473-d90c-493d1640070c>