Is there an equivalent for Glob in D Phobos?
在 python 中,我可以使用 glob 来搜索路径模式。例如:
1 2 3 | import glob for entry in glob.glob("/usr/*/python*"): print(entry) |
会打印这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /usr/share/python3 /usr/share/python3-plainbox /usr/share/python /usr/share/python-apt /usr/include/python3.5m /usr/bin/python3 /usr/bin/python3m /usr/bin/python2.7 /usr/bin/python /usr/bin/python3.5 /usr/bin/python3.5m /usr/bin/python2 /usr/lib/python3 /usr/lib/python2.7 /usr/lib/python3.5 |
我将如何在 D 中
-----2017 年 9 月 12 日更新------
我写了一个小D模块来做D中的Glob:https://github.com/workhorsy/d-glob
以上答案都没有与 Windows 和 Linux 上的 Glob 100% 相同。所以我做了一个小的 D 模块,它以正确的方式运行 Glob。希望人们觉得它有用:
https://github.com/workhorsy/d-glob
1 2 3 4 5 6 | import std.stdio : stdout; import glob : glob; foreach (entry ; glob("/usr/*/python*")) { stdout.writefln("%s", entry); } |
如果你只在Posix系统上工作,你可以直接调用
1 2 3 4 5 6 7 | void main() { import std.stdio; import glob : glob; foreach(entry; glob("/usr/*/python*")) writeln(entry); } |
你可以编译这个,例如使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | /* Copyright (C) 1991-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ string[] glob(string pattern) { import std.string; string[] results; glob_t glob_result; glob(pattern.toStringz, 0, null, &glob_result); for (uint i = 0; i < glob_result.gl_pathc; i++) { results ~= glob_result.gl_pathv[i].fromStringz().idup; } globfree(&glob_result); return results; } import core.stdc.config; extern (C): enum _GLOB_H = 1; /* We need `size_t' for the following definitions. */ alias c_ulong __size_t; alias c_ulong size_t; /* The GNU CC stddef.h version defines __size_t as empty. We need a real definition. */ /* Bits set in the FLAGS argument to `glob'. */ enum GLOB_ERR = 1 << 0; /* Return on read errors. */ enum GLOB_MARK = 1 << 1; /* Append a slash to each name. */ enum GLOB_NOSORT = 1 << 2; /* Don't sort the names. */ enum GLOB_DOOFFS = 1 << 3; /* Insert PGLOB->gl_offs NULLs. */ enum GLOB_NOCHECK = 1 << 4; /* If nothing matches, return the pattern. */ enum GLOB_APPEND = 1 << 5; /* Append to results of a previous call. */ enum GLOB_NOESCAPE = 1 << 6; /* Backslashes don't quote metacharacters. */ enum GLOB_PERIOD = 1 << 7; /* Leading `.' can be matched by metachars. */ enum GLOB_MAGCHAR = 1 << 8; /* Set in gl_flags if any metachars seen. */ enum GLOB_ALTDIRFUNC = 1 << 9; /* Use gl_opendir et al functions. */ enum GLOB_BRACE = 1 << 10; /* Expand"{a,b}" to"a""b". */ enum GLOB_NOMAGIC = 1 << 11; /* If no magic chars, return the pattern. */ enum GLOB_TILDE = 1 << 12; /* Expand ~user and ~ to home directories. */ enum GLOB_ONLYDIR = 1 << 13; /* Match only directories. */ enum GLOB_TILDE_CHECK = 1 << 14; /* Like GLOB_TILDE but return an error if the user name is not available. */ enum __GLOB_FLAGS = GLOB_ERR | GLOB_MARK | GLOB_NOSORT | GLOB_DOOFFS | GLOB_NOESCAPE | GLOB_NOCHECK | GLOB_APPEND | GLOB_PERIOD | GLOB_ALTDIRFUNC | GLOB_BRACE | GLOB_NOMAGIC | GLOB_TILDE | GLOB_ONLYDIR | GLOB_TILDE_CHECK; /* Error returns from `glob'. */ enum GLOB_NOSPACE = 1; /* Ran out of memory. */ enum GLOB_ABORTED = 2; /* Read error. */ enum GLOB_NOMATCH = 3; /* No matches found. */ enum GLOB_NOSYS = 4; /* Not implemented. */ /* Previous versions of this file defined GLOB_ABEND instead of GLOB_ABORTED. Provide a compatibility definition here. */ /* Structure describing a globbing run. */ struct glob_t { __size_t gl_pathc; /* Count of paths matched by the pattern. */ char** gl_pathv; /* List of matched pathnames. */ __size_t gl_offs; /* Slots to reserve in `gl_pathv'. */ int gl_flags; /* Set to FLAGS, maybe | GLOB_MAGCHAR. */ /* If the GLOB_ALTDIRFUNC flag is set, the following functions are used instead of the normal file access functions. */ void function (void*) gl_closedir; void* function (void*) gl_readdir; void* function (const(char)*) gl_opendir; int function (const(char)*, void*) gl_lstat; int function (const(char)*, void*) gl_stat; } /* If the GLOB_ALTDIRFUNC flag is set, the following functions are used instead of the normal file access functions. */ /* Do glob searching for PATTERN, placing results in PGLOB. The bits defined above may be set in FLAGS. If a directory cannot be opened or read and ERRFUNC is not nil, it is called with the pathname that caused the error, and the `errno' value from the failing call; if it returns non-zero `glob' returns GLOB_ABEND; if it returns zero, the error is ignored. If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned. Otherwise, `glob' returns zero. */ int glob ( const(char)* __pattern, int __flags, int function (const(char)*, int) __errfunc, glob_t* __pglob); /* Free storage allocated in PGLOB by a previous `glob' call. */ void globfree (glob_t* __pglob); |
基本上,您不需要用头文件、C 等语言做所有这些复杂的事情。这应该做的事情:
1 2 3 | auto dirIter = dirEntries("/usr","*/python*", SpanMode.shallow); foreach(dirFile; dirIter) { // Process the result as needed |
也许你正在寻找
这是文档中的示例:
1 2 3 4 5 | // Iterate over all D source files in current directory and all its // subdirectories auto dFiles = dirEntries("","*.{d,di}",SpanMode.depth); foreach(d; dFiles) writeln(d.name); |