为何ls -A $path命令未将桌面目录识别为空目录?
问题原因分析
1. 桌面目录存在隐藏文件/目录
ls -A 命令会显示目录下除 . 和 .. 之外的所有文件(包括隐藏文件/目录)。如果桌面目录里有系统自动生成的隐藏文件(比如 macOS 下的 .DS_Store、Windows/WSL 下的 desktop.ini,或是用户自行创建的以 . 开头的隐藏文件),ls -A $path 就会有输出,导致 if 条件判断为真,不会被识别为空目录。
2. 变量 $path 引用未加引号
原代码中 ls -A $path 没有给 $path 加双引号,如果桌面目录的路径包含空格(比如 ~/My Desktop),Bash 会将空格作为分隔符拆分变量值,ls 会把拆分后的多个部分当成不同的路径参数,可能导致命令输出异常(比如找不到部分路径的报错信息),进而让条件判断误判为非空。
3. $path 指向的路径不正确
如果 $path 的值拼写错误,或是实际指向的并非你认为的空桌面目录(比如指向了其他有内容的子目录),ls -A 自然会有输出,无法识别为空目录。
修正建议
- 给变量引用加上双引号,避免路径含空格时出现问题:
if [ "$(ls -A "$path")" ];then echo "$path" dirpath="$mainPath/$path" fi - 更可靠的空目录判断方法(避免依赖
ls的输出):
这个方法通过直接枚举目录下的文件(包括隐藏文件)、统计数量来判断是否为空,比调用shopt -s nullglob files=("$path"/* "$path"/.[!.]*) if [ ${#files[@]} -gt 0 ]; then echo "$path" dirpath="$mainPath/$path" fi shopt -u nullglobls更稳定。
内容的提问来源于stack exchange,提问作者Potato Master
相关产品推荐
相关产品推荐

