Find path in bash on insensitive manner

此生再无相见时 提交于 2019-12-02 17:14:59

问题


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


来源:https://stackoverflow.com/questions/11862746/find-path-in-bash-on-insensitive-manner

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!