如何检查隐藏文件是不是存在?

Posted

技术标签:

【中文标题】如何检查隐藏文件是不是存在?【英文标题】:How can I check if hidden files exist?如何检查隐藏文件是否存在? 【发布时间】:2020-05-22 23:18:29 【问题描述】:

Adobe 可以选择下载字体,这对我们行业来说是个问题。我找到了这些文件的位置,现在我想创建一个 Jamf Smart 组来检查字体是否已下载。

文件位置是/Users/$loggedInUser/Library/Application\ Support/Adobe/CoreSync/plugins/livetype/.r/

文件名是数字的组合。示例:.33805.otf

到目前为止,我有以下内容,但它不起作用。我不断得到False 输出。

USERS="`ls /Users | grep -v "Shared"`" 

for Adobe in $USERS; do
    if  [[ -a "/Users/$Adobe/Library/Application\ Support/Adobe/CoreSync/plugins/livetype/.r/.[^.]*otf"  ]]  ; then
              echo "True"
    else
              echo "False"
    fi
done

【问题讨论】:

在开始时将shopt -s dotglob 使用数组users=(/users/*) 或使用-A 选项,如果您的ls 有它,请引用您的变量并且不要使用大写变量,您可能/将覆盖环境变量$USER 【参考方案1】:

You really want to avoid ls here. 更健壮和便携的解决方案是简单地循环匹配。

开箱即用,shell 在一般 glob 结果中不包含点文件;但如果您在通配符中包含一个点,它将正常扩展它。

但是,您不能在通配符周围使用双引号;这样做会将* 的含义从通配符更改为文字星号(对于其他通配符,如?[ 等也是如此)。

for user in /Users/*; do
    case $user in *Shared*) continue;; esac
    for file in "$user/Library/Application Support/Adobe/CoreSync/plugins/livetype/.r/".[!.]*otf; do
        if [[ -a "$file" ]]; then
              echo "True"
        else
              echo "False"
        fi
        break
    done
done

for 循环并不完全直观,但这是一种可靠地检查通配符是否匹配任何文件的好方法。开始一个循环,但只执行第一次迭代;如果第一个文件不存在,则意味着 shell 无法扩展通配符,并逐字返回。 (这是默认和传统的 Bourne shell 行为;现代 shell 有 nullglob 等,一些管理员喜欢为所有新用户启用。)

【讨论】:

【参考方案2】:
shopt -s dotglob

for adobe in /users/*; do
   [[ $adobe == *Shared* ]] && continue  ##: skip the Shared match
    # do the rest of the stuff here    
done

【讨论】:

以上是关于如何检查隐藏文件是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章

如果文本文件不存在并显示另一个表单,则在表单加载时隐藏表单

检查页面上是不是存在表单并将其隐藏

Flutter检查json显示/隐藏容器中是不是存在值

根据图像是不是存在隐藏 TPL 文件中的 DIV?

如何在 Python 中检查文件夹的“隐藏”属性?

如何检查任何值是不是已隐藏在 iphone 应用程序中