这个问题的背景是hg-ssh
脚本。了解一些内容很有帮助,但并不重要水银。该脚本使用公钥设置强制命令,因此服务器上给定的公钥设置将只允许相应私钥的所有者推送到服务器上允许的一组存储库。此强制命令通常以~/.ssh/authorized_keys
服务器上文件中的公钥为前缀。关于这个允许的集合,上面链接中脚本之前的文档说:
You can use pattern matching of your normal shell, e.g.:
command="cd repos && hg-ssh user/thomas/* projects/{mercurial,foo}"
这个想法是只允许推送到服务器上与此模式匹配的存储库。我一直使用hg-ssh
强制命令
command="cd /srv/hg && /usr/local/bin/hg-ssh * */* */*/* */*/*/*",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa [...]
/srv/hg
使用 shell 通配符来匹配 下的所有存储库(最多一定数量的路径组件) 。我后来才意识到它是不是包含以.
.开头的组件的匹配路径。我当前的非工作示例是MQ存储库/srv/hg/faheem/bixfile/.hg/patches
。所以,我的问题是,我可以选择一个对应的模式吗?全部路径?我更喜欢使用 shell 通配符,一般情况下,它比正则表达式更容易解决问题,但如果无法选择通配符,我会采用正则表达式。
答案1
对于递归匹配,正确的工具通常是find
.由于您希望递归地匹配当前目录及其子目录中的所有文件,但仅限于一定深度,因此请指定-maxdepth
.这不在POSIX,但存在于所有当前的 *BSD 和 GNU find(Linux、Cygwin)和 Busybox(嵌入式 Linux)中,因此可以肯定您拥有它。-exec … {} +
是 POSIX 的一个相对较新的补充,但它已经出现在 GNU 和 FreeBSD/NetBSD/OSX 中一段时间了。
cd /srv/hg && find . -type d -maxdepth 3 -exec /usr/local/bin/hg-ssh {} +
(我添加是-type d
因为您似乎只想匹配目录,即使您尝试使用* */*
etc. 匹配所有类型的文件。)