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>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --]
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)
[-- Attachment #2 --]
#! /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";
}
}
}
[-- Attachment #3 --]
#! /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'
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200209190757.22640.bts>
