如何检查隐藏文件是不是存在?
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
【讨论】:
以上是关于如何检查隐藏文件是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章