Find path in bash on insensitive manner

2019-03-06 04:32发布

问题:

Suppose a path like

/home/albfan/Projects/InSaNEWEBproJECT

Despite of the fact to not use such that names. Is there a way to check for a path in an insensitive manner?

I came across to this solution, but I would like to find a builtin or gnu program, if it is possible.

function searchPathInsensitive {
 # Replace bar with comma (not valid directory character allowing parse dirs with spaces)
 #also remove first / if exist (if not this create a first empty element

 ORG="$1"
 if [ "${ORG:0:1}" = "/" ]
 then
  ORG="${ORG:1}"
 else
  ORG="${PWD:1}/$ORG"
 fi
 OLDIFS=$IF
 IFS=,
 for dir in ${ORG//\//,}
 do
  if [ -z $DIR ]
  then
   DIR="/$dir"
  else
   TMP_DIR="$DIR/$dir"
   DIR=$(/usr/bin/find $DIR -maxdepth 1 -ipath $TMP_DIR -print -quit)
   if [ -z $DIR ]
   then
    # If some of the path does not exist just copy the element
    # exit 1        
    DIR="$TMP_DIR"
   fi
  fi
 done
 IFS=$OLDIFS
 echo "$DIR"
}

to use it just do:

 (searching on my home)
$ searchPathInsensitive projects/insanewebproject
/home/albfan/Projects/InSaNEWEBproJECT

(inside a project)
$ searchPathInsensitive src/main/java/org/package/webprotocolhttpwrapper.java
/home/albfan/Projects/InSaNEWEBproJECT/src/main/java/org/package/WebProtocolHTTPWrapper.java

$ searchPathInsensitive src/main/resources/logout.png
/home/albfan/Projects/InSaNEWEBproJECT/src/main/resources/LogOut.PNG

I guess the solution is related in any way with find -ipath as all I do with the function is search only for next element in path given on insensitive manner

回答1:

My fault! I guess I tried

find -ipath 'projects/insanewebproject' 

but the trick here is that I must use

find -ipath './projects/insanewebproject'

That ./ does the change. Thanks!.

man says -path is more portable than -wholename

if you expect only one result, you can add | head -n1, cause that way head kill pipe when it fills its buffer, which is only one line length

find -ipath './projects/insanewebproject'| head -n1


回答2:

The simplest solution:

$ find . | grep -qi /path/to/something[^/]*$ 

But if you have some additional conditions that must be checked for matched file, you can run grep inside find:

$ find . -exec sh -c 'echo {} | grep -qi /path/to/something' \; -print

Here you will get all files that are in the directory. If you want to get only the directory's name:

$ find . -exec sh -c 'echo {} | grep -qi /path/to/something[^/]*$' \; -print

Example of usage:

$ mkdir -p Projects/InSaNEWEBproJECT/src/main/resources/
$ find . -exec sh -c 'echo {} | grep -qi /projects/insanewebproject[^/]*$' \; -print
./Projects/InSaNEWEBproJECT