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