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

我正在做以下事情:
if [ -f $FILE ] ; then
    echo "File exists"
fi

但我希望-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

但不区分大小写的globbing仅适用于文件名部分,而不适用于完整路径.因此,如果TARG是/ etc / somefile,它将无法工作.

有没有办法做到这一点?

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

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

鉴于这一切,这有效:

if [[ -n `find /etc -maxdepth 1 -iname passwd` ]]; 
    then echo "Found";
fi

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

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...