在bash中,文件操作符(-f)是否可以不区分大小写?

Pau*_*ter 7 bash case-insensitive

我正在做以下事情:

if [ -f $FILE ] ; then
    echo "File exists"
fi
Run Code Online (Sandbox Code Playgroud)

但我希望它-f不区分大小写.也就是说,如果FILE是/etc/somefile,我希望-f识别/Etc/SomeFile.

我可以用glob部分解决它:

shopt -s nocaseglob
TARG='/etc/somefile'

MATCH=$TARG*    #assume it returns only one match

if [[ -f $MATCH ]] ; then
    echo "File exists" 
fi
Run Code Online (Sandbox Code Playgroud)

但不区分大小写的globbing仅适用于文件名部分,而不适用于完整路径.所以,如果TARG是行不通的话/Etc/somefile.

有没有办法做到这一点?

Bor*_*lid 10

问题是您的文件系统区分大小写.文件系统只提供了两种获取文件的相关方法:要么指定一个精确的区分大小写的文件名并检查它是否存在,要么读取目录中的所有文件,然后检查每个文件是否与模式匹配.

换句话说,检查区分大小写的文件系统上是否存在不区分大小写的文件是非常低效的.shell可能会为你做,但在内部它会读取所有目录的内容并根据模式检查每个目录的内容.

鉴于这一切,这有效:

if [[ -n `find /etc -maxdepth 1 -iname passwd` ]]; 
    then echo "Found";
fi
Run Code Online (Sandbox Code Playgroud)

但除非您想要从'/'开始搜索所有内容,否则必须单独检查路径的组成部分.没有办法解决这个问题; 你不能在区分大小写的文件系统上神奇地检查整个路径以获取不区分大小写的匹配!