【问题标题】:How to list all subdirectories with a string but not subdirectories of a match如何使用字符串列出所有子目录但不列出匹配的子目录
【发布时间】: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


    【解决方案1】:

    这样做:

    find -type d  -regex ".*py.*bin.*" 
    

    开始吧?

    【讨论】:

    • 与我的 ls/grep 混乱相比,该 find 表达式对于查找目录非常方便!此外,我最终找到了正确的正则表达式:find $HOME/bin $HOME/dev -type d -regex ".*\/py\(\w\|-\w\)*"
    猜你喜欢
    • 2011-11-09
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2011-11-09
    • 2013-07-22
    • 1970-01-01
    • 2012-11-14
    • 2020-08-19
    相关资源
    最近更新 更多