我正在执行以下操作:
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
但是不区分大小写的glob只在文件名部分起作用,而不是在完整路径上起作用。因此,如果TARG为/Etc/somefile
,则将不起作用。
有什么办法吗?
问题是您的文件系统区分大小写。文件系统仅提供两种相关的获取文件的方式:要么指定一个精确的,区分大小写的文件名,然后以这种方式检查文件名的存在,要么读取目录中的所有文件,然后检查每个文件是否与某个模式匹配。 >
换句话说,检查区分大小写的文件系统上是否存在不区分大小写的文件版本是非常低效的。 Shell可能会为您完成此操作,但在内部它会读取目录的所有内容,并根据模式检查每个目录的内容。
鉴于所有这些,这有效:
if [[ -n $(find /etc -maxdepth 1 -iname passwd) ]]; then echo "Found"; fi
但是除非您要搜索从'/'开始的所有内容,否则必须单独检查路径的组成部分。没有办法解决这个问题。您无法神奇地检查整个路径,以区分大小写的文件系统上不区分大小写的匹配项!
不知道如何仅使用shell评估。但是grep可能不区分大小写,因此调用grep,find和wc的脚本可能会满足您的需求。
您可以使用nocasematch选项
通常,如果文件系统不区分大小写,这很难做到。基本上,您已经分别遍历了每个祖先目录。这是Python的起点:
cd /etc
# using FreeBSD find
find -x -L "$(pwd)" -maxdepth 1 -type f -iregex "/EtC/[^\/]*" -iname paSSwd
这是使用Bash的起点: