Date: Thu, 19 Sep 2002 07:57:21 -0400 From: "Brian T. Schellenberger" <bts@babbleon.org> To: Peter Leftwich <Hostmaster@Video2Video.Com>, FreeBSD LIST <FreeBSD-Questions@freebsd.org> Subject: Re: find case-insensitive challenge Message-ID: <200209190757.22640.bts@babbleon.org> In-Reply-To: <20020919013548.H83658-100000@earl-grey.cloud9.net> References: <20020919013548.H83658-100000@earl-grey.cloud9.net>
next in thread | previous in thread | raw e-mail | index | archive | help
--------------Boundary-00=_L7POY5N4J9GXWY9SX6KQ
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: 8bit
On Thursday 19 September 2002 01:38 am, Peter Leftwich wrote:
| Tonight I surprised myself by running `find ~/Desktop/folder/ -name
| "*.jpg" -exec mv {} ~/Desktop/folderjpgs/ \;` successfully!  My first
| custom find command line ever.
|
| But there were two issues -- I had to escape the semicolon with a "\"
Yes, it always works that way.
| -- does this ever cause problems for find command lines? 
No, not really.
| Second,
| this found only *.jpg files and left behind *.JPG files so how do you
| make find be case-insensitive?
find ~/Desktop/folder/ \( -name "*.jpg" -o -name "*.JPG" \)  \
     -exec mv {} ~/Desktop/folderjpgs/ \;
Actually, what *I* do is avoid having files with capital letters in 
them, or spaces, or &'s, or any of those other goofy characters you 
sometimes find in Windows file names.  Then I don't have to do the 
above.  I accomplish that with the attached pair of scripts, though 
there are no doubts lots of other nice ways to do this.
(I run the "unmsdos" script over files that I download from the web or 
newsgroups or what-have-you.  It makes all of file names 
"Unix-friendly" and, if the file is a text file, it invokes uncrnl to 
change the cr-nl's at the ends of lines into just plan nl's.)
| -exec ThankYouScript.sh {} \;
-- 
Brian, the man from Babble-On . . . .   bts@babbleon.org (personal)
--------------Boundary-00=_L7POY5N4J9GXWY9SX6KQ
Content-Type: application/x-perl;
  name="unmsdos"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="unmsdos"
#! /usr/bin/perl
#
# By Brian T. Schellenberger   (bts@babbleon.org)
# Please maintain this credit but otherwise, use as you see fit.
# (If it gets substantially transmorgified, it would probably be
# best to just say "based on . . . "
#
if ($ARGV[0] eq '-c')   # Special CD-ROM mode
{
    $cdrom = 1;
}
if ($ARGV[0] eq '-n') 
{
    shift;
    $putname = 1;
}
foreach (@ARGV)
{
    # unmsdos accpets a "quoting" convention of angle-brackets to
    # quote names.  If it has 'em, strip 'em.  If it has the leading,
    # but not the trailing, bracket then save this one and come 
    # around again.  First see if we are continued from before.
    if ($pending)
    {
        $_ = $pending . ' ' .$_;
        $pending = "";
    }
    if (/^</)
    {
        if (/>$/)
        {
            s/^<//;
            s/>$//;
        }
        else
        {
            $pending = $_;
            next;
        }
    }
    $path = $_;
    $path = "."  if (! /\//);
    $path =~ s|/[^/]*$||;
    s|^.*/||;
    $newname = $_;
    if ($cdrom)
    {
        next if (length > 12 || /[a-z]/);  # 12 = 8.3 (12345678.ABC)
        goto justLowercase;
    }
    # If it's one of my "rated" names, seperate out the rating part.
    # Always take out leading paths for file renames.
    $prefix = "";
    if (/^(.*\/)?(\w+-\w+-\w+:)?/)
    {
        $prefix = $&;
        $_ = $';
    }
    # name conversions.
    $newname =~ tr/\x80-\xFF/\x00-\x7F/;
    $newname =~ s/[\x00- ]/_/g;
    $newname =~ s/[[\]]/_/g;
    $newname =~ s/\&/+/g;
    $newname =~ s/\s/_/g;
    $newname =~ s/^~/_/g;
    $newname =~ s/^\+/p_/g;
    $newname =~ s/([^.])~/$1-/g;
    $newname =~ s/;/@/g;
    $newname =~ s/[ `'"!&*$;]/_/g;
    $newname =~ s/\$/_/g;
    $newname =~ s/[:{}|()<>]/-/g;
    $newname =~ s/^-/_/;
    $newname =~ s/\?/q/g;
    $newname =~ s/#/=/g;
    $newname =~ s/\\/_/g;
justLowercase:
    $newname =~ tr/A-Z/a-z/;
    if ($putname)
    {
        print "$newname\n";
        next;
    }
    $newname = $path . "/" . $newname;
    $_ = $path . "/" . $_;
    if ($newname ne $_)
    {
        print "$_ -> $newname\n";
        if (-e $prefix . $newname)
        {
            print STDERR "$newname already exists; can't rename\n";
        }
        else
        {
            if (rename($prefix . $_, $prefix . $newname))
            {
                $_ = $newname;
            }
            else
            {
                print STDERR "Rename to $newname failed.\n";
            }
        }
    }
    # Changes to file contents . . .
    $_ = $prefix . $_;
    if (-T $_ && !$cdrom)
    {
        if (system('uncrnl', $_)/256 == 0)
        {
            print "Uncrnl'ed $_\n";
        }
        else
        {
            print STDERR "Uncrnl $_ failed.\n";
        }
    }
}
--------------Boundary-00=_L7POY5N4J9GXWY9SX6KQ
Content-Type: application/x-shellscript;
  name="uncrnl"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="uncrnl"
#! /bin/tcsh -f
# set echo
# By Brian T. Schellenberger
# probably pointless but I didn't know about fromdos or whatever the
# standard tool is when I wrote it.
if ("$1" =~ */*) then
    set plc = $1:h
    set file = $1:t
    cd $plc
else
    set file = $1
endif
mv $file }$file}
tr < }$file} > $file -d '\r'
--------------Boundary-00=_L7POY5N4J9GXWY9SX6KQ--
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200209190757.22640.bts>
