1

编辑#1:我受到所有参数都用两个引号括起来的限制,因此shell不会将任何参数扩展*到相应的路径。

编辑#2:为了检索诸如 、 和 之类的目录*/*../*dirA/*/file.out应该如何使用迭代循环或递归调用?

我刚刚了解了这个功能fnmatch()。但我不知道起点。
有很多可能的情况。我对处理所有这些情况感到困惑。
例如,让我假设可执行程序是a.out.

$./a.out -l */*
$./a.out -l ../*
$./a.out -l [file_name] [directory_name] 
/* Since I also have to implement ls command with no wildcard. */

我应该怎么办?任何建议都会很棒。
先感谢您。

4

2 回答 2

0

如果你想成为一个优秀的 unix 公民,规则是不要进行文件名通配,除非你正在编写一个 shell。

你想写一个ls类似的程序吗?不要进行任何通配符扩展。不要特别对待“*”。只需将您argv视为文件名列表即可。如果您的程序处理这些情况:

./a.out file1
./a.out file1 file2 file3

然后它也会处理

./a.out file*

正确,因为 shell 将进行扩展,您的程序不需要知道它。除此之外,它将处理这个:

zsh% ./a.out **/file<40-185>~file<90-100>(.mm-30OL[1,2])

在 zsh 扩展 glob 语法中表示:将 file40 扩展至 file185,除了 file90 至 file100,仅包含最近 30 分钟内修改过的文件,并且仅使用结果集中最大的 2 个文件。

fnmatch永远不会做那样的事情。但是这些花哨的 glob 可以与任何只接受文件名列表而不关心它来自哪里的命令一起使用。

当您无法从命令行获取文件名列表时,请考虑使用 fnmatch。ls不是其中一种情况。

于 2013-06-19T20:57:14.650 回答
0

您的问题是:shell 将通配符 * 替换为与模式匹配的所有文件名。

解决方案:

如果您不想使用 bash 的此功能,只需在命令行参数周围加上引号即可。

以这种方式调用您的程序将具有包含通配符的原始参数。

在此之后,您可以列出所有文件名及其路径。例如使用一些递归算法。然后您可以对这些路径字符串应用一些匹配。(访问时)

于 2013-06-19T20:00:02.990 回答