在macOS系统的终端中,通配符“*”是否可以匹配路径?
美国、香港服务器
在macOS系统的终端中,通配符“*”是否可以匹配路径?
09-16 来源:
在 macOS 终端中,通配符 * 可以匹配路径中的目录或文件名称,但无法直接跨越路径分隔符 / 进行跨层级匹配(即不能自动递归匹配子目录中的内容,除非结合特定语法或命令参数)。具体规则如下:
一、* 在路径中的基础匹配能力
* 可以匹配路径中单个层级的目录或文件名称,配合 / 路径分隔符使用时,能筛选特定目录结构下的内容。
示例:
匹配指定目录下的所有内容
bash
# 匹配 /Users/yourname/Documents 目录下的所有文件和子目录
ls /Users/yourname/Documents/*
* 在这里匹配 Documents 目录下的所有直接子项(文件或目录),但不包含 Documents 子目录内的深层内容。
匹配路径中某一层级的特定名称
bash
# 匹配 /Users 目录下所有以 "j" 开头的用户目录(如 "john"、"jane")
ls /Users/j*
# 匹配所有用户目录下的 "Desktop" 文件夹(如 /Users/john/Desktop、/Users/jane/Desktop)
ls /Users/*/Desktop
* 仅匹配 /Users 下的一级目录名称,/Users/*/Desktop 表示 “/Users 下任意用户目录中的 Desktop 文件夹”。
结合文件类型匹配路径中的文件
bash
# 匹配 /Applications 目录下所有以 ".app" 结尾的应用(如 "Safari.app"、"Terminal.app")
ls /Applications/*.app
二、* 不能直接跨层级匹配(默认行为)
* 本质是 “单层级匹配符”,无法自动跨越 / 匹配深层子目录。例如:
bash
# 意图:匹配 ~/Documents 及其所有子目录下的 .txt 文件
# 实际结果:仅匹配 ~/Documents 直接目录下的 .txt 文件,不包含子目录中的 .txt
ls ~/Documents/*.txt
若需跨层级(递归)匹配路径中的内容,需使用 **(扩展通配符,双星号)或结合支持递归的命令(如 find):
三、跨层级匹配路径的方法(突破单层级限制)
1. 使用 ** 递归匹配所有子目录(zsh/bash 支持)
macOS 终端默认的 zsh(或 bash 开启 globstar 选项后)支持 ** 通配符,可跨越任意层级目录匹配内容:
bash
# 匹配 ~/Documents 及其所有子目录(包括深层子目录)中的 .txt 文件
ls ~/Documents/**/*.txt
** 表示 “当前目录及所有子目录”,**/*.txt 即 “所有层级目录中的 .txt 文件”。
若使用 bash,需先开启 globstar 选项:shopt -s globstar(关闭:shopt -u globstar)。
2. 结合 find 命令递归匹配路径
find 命令天生支持递归遍历目录,配合 -path 参数可实现路径级别的通配符匹配:
bash
# 递归匹配 /var 目录下所有路径中包含 "log" 的 .log 文件
find /var -type f -path "*/log/*.log"
-path "*/log/*.log" 表示 “任意层级目录中,包含 log 子目录的路径下的 .log 文件”(如 /var/log/syslog.log、/var/www/log/access.log)。
四、总结
* 可以匹配路径中单个层级的目录或文件名称(如 /Users/*/Desktop 中的 * 匹配一级用户目录);
* 不能直接跨越 / 进行跨层级递归匹配,需用 **(扩展通配符)或 find 命令实现;
结合路径分隔符 / 和 *,可精准筛选特定目录结构下的内容,是终端中批量处理文件的高效方式。
三二互联专业提供香港VPS,美国VPS主机,香港云服务器租用等业务香港美国到大陆CN2 GIA速度最快