Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

The main problem is my directory has many files with uppercase (e.g. Foobar.txt, FooBar.txt, even FOOBAR.txt). And I find it messy to find the files by exactly typing it (if I know the exact filenames, why would I use find?). So I want to type just foobar and want all three files in result

Also, I am using * both of the side of my string to match any number of characters preceding and appending in the file name.

I want an alias or function that does this.

share|improve this question
    
I don't see the advantage of an function here. –  Bernhard Aug 27 '12 at 5:54

2 Answers 2

up vote 9 down vote accepted

The correct way then would be

find -iname \*foobar\*

Where -iname is for case insensitive search, and the \ to escape the * wildcard.

The function seems a bit unnecessary for this case, but it is easy to write

function lazyfind ()
{
    find -iname \*$1\*
}
share|improve this answer
    
Hey! its hard to type the escape characters everytime, do anything.. –  Santosh Kumar Aug 27 '12 at 6:05
    
Well, for these simple tasks, I think it is better to type them again. Especially when working on multiple machines, it also annoying to copy functions for simple tasks. –  Bernhard Aug 27 '12 at 6:15
    
@santosh, you can get the same result by using quotes: find -iname "*foo*". –  terdon Aug 27 '12 at 11:10
1  
And using quote is more friendly if $1 can contain spaces. –  ams Aug 28 '12 at 12:03
    
And how to do that recursively? –  Santosh Kumar Jan 22 '13 at 8:26

Should you OS is missing GNU find -iname option, here is a portable way to achieve the same:

cifind()
{
  pattern=""
  l=${#1}
  i=1
  while [ $i -le $l ] ; do
    lc=$(echo "$1" | cut -c $i-$i | tr '[A-Z]' '[a-z]')
    uc=$(echo "$lc" | tr '[a-z]' '[A-Z]')
    if [ ."$lc" != ."$uc" ] ; then
      pattern="${pattern}[$lc$uc]"
    else
      pattern="${pattern}$lc"
    fi
    i=$((i + 1))
  done
  find . -name "*$pattern*"
}
share|improve this answer
1  
Make that l=$(expr "x$1" : '.*') and [ $i -le $l ], in case $1 begins with -. Or embrace POSIX and write l=${#1}, the script will be faster. Or use awk, which will be easier, less error-prone and faster. –  Gilles Aug 27 '12 at 23:36
    
@Gilles: For some reason, I thought ${#var} wasn't posix, thanks for the head-up. I don't think there is an issue with [ $i -le $l ] , however, I also corrected $lc != $uc to .$lc != .$uc to properly handle hyphens. –  jlliagre Aug 28 '12 at 0:30
    
Arithmetic expressions ($((…))) are POSIX too. I meant [ $i -lt $l ] in my first comment, because "x$1" is one character longer — but using ${#1} is clearer. –  Gilles Aug 28 '12 at 12:46
    
@Gilles, got it, thanks. –  jlliagre Aug 28 '12 at 13:13

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.