【发布时间】:2012-03-31 21:06:12
【问题描述】:
在 bash 脚本中,我想解析所有子目录的名称并找到所有具有匹配字符串的子目录,但我不想要匹配的子目录。我有兴趣根据目录结构自动构建我的 $PATH 和 $PYTHONPATH 变量。
这是一个例子: 假设我想浏览我的 ~/dev 和 ~/bin 文件夹并找到所有带有 bin/ 的子目录,其中包含我想在 shell 上运行的程序。我可以用
得到一个列表$ ls -lR $HOME/bin $HOME/dev |grep "\/" | grep "bin:"
/Users/dat5h/bin:
/Users/dat5h/bin/project/bin:
...
这些都可以附加到$PATH 并准备好运行所有可用的脚本。
但是,假设我正在搜索包含要添加到 $PYTHONPATH 的 python 模块和包的目录。我可以想象查找以/py- 开头的所有目录。所以,我试试:
$ ls -lR $HOME/bin $HOME/dev |grep "\/" | grep "/py-"
/Users/dat5h/bin/py-test:
/Users/dat5h/bin/py-test/test-package:
/Users/dat5h/bin/py-test/test-package/nested-test:
...
我的想法是我不想将包目录和子目录放入路径中。我很确定这会很奇怪,但我实际上是 python 新手,所以建议会有所帮助。我将如何构建一个测试用例以仅获取具有 py-* 的目录但不获取后续子目录?
我试过了:
$ ls -lR $HOME/bin $HOME/dev |grep "\/" | egrep "/py-.*[^/]:"
但这也不能完成工作。也许一个更好的正则表达式?任何帮助将不胜感激!
解决方案
我最终满意的解决方案是使用 cutoms 正则表达式在下面建议的查找:
find $HOME/bin $HOME/dev -type d -regex ".*\/py\(\w\|-\w\)*"
这将找到 ~/bin 和 ~/dev 的所有子目录,它们是“pySOMETHING”、“py-SOMETHING”、“pySOME_THING_ELSE”或“py-SOME_THING_ELSE”的一些变体,但不会抓取这些子目录的任何子目录,除非他们也匹配这个字符串。这确保了我可以使用 python 模块/包对我的所有目录进行一些简单的命名约定,并以这种方式导入它们,而不会意外地导入没有层次结构的嵌套包。
【问题讨论】:
标签: regex bash parsing path pythonpath