你有一个c ++程序,它详细说明了一组具有相同前缀的文件(即file0,file1,file2等)。当我运行程序时(在linux系统上)我通常将前缀作为命令行参数传递:
myscript file*
这详细说明了具有前缀文件的所有文件(在文件夹中)。 c ++脚本包含for循环:
for(i=1;i<argc;i++) {
//do something
}
我不是c ++的专家,我不知道如何阐述*。现在,我怎样才能将文件的子集(即从file0到file10或从file20传递到file35)到c ++程序?如何使用shell命令列出文件的子集?
答案 0 :(得分:3)
假设您在类似Linux的系统上运行,*在执行程序之前由shell评估*(顺便称之为程序,而不是脚本,因为它首先必须在执行之前编译)
所以shell扩展了*以匹配所有内容。这意味着您应该修改调用程序的方式,而不是修改代码。例如,File0 *将匹配以File0开头的任何内容。
很有可能你正在使用bash终端,在这种情况下你应该寻找命令行帮助。 GNU项目发布了一本名为“命令行介绍”(http://shop.fsf.org/product/Introduction_to_Command_Line/)的好书,该书在gpl下发布并免费提供。你可能会喜欢它。
你可能想知道你的行:for(i = 2; i 首先,您将i设置为2,跳过第一个命令行参数。 argv是一个数组,其中第0个元素是命令本身,所有选项都在元素1到argc-1中。如果你在内部跳过第一个论点,那就没关系。
第二个是非常小的,但是习惯于在后缀上优先选择前缀增量操作(++ i)是个好主意。它不会对一个简单的整数产生影响,但在某些情况下使用前缀运算符会产生更高效的代码(通过避免不必要的临时)。由于前缀运算符与后缀一样可读,因此除非您确实需要后缀运算符,否则不会因为习惯总是使用前缀运算符而失去任何东西。例如,在Sutter和Alexandrescu的C ++编码指南的第1项(不要过早优化或过早地优化)中对此进行了很好的讨论。
答案 1 :(得分:1)
Basile是对的,cpp程序只看到真正的文件名。传递给程序的文件名序列是shell文件名扩展的结果:在文件a1,a1,a3,a11的目录中,echo a[0-9]
之类的命令会导致&#34; a1 a2 a3&#34;。
bash没有真正的正则表达式,因此您需要通过grep管道ls命令,以便获取所有名为f1 ... f100左右的文件(具有不同的数字长度)。示例:ls | egrep 'file[0-9]+'
。
一个程序&#34; my_executable&#34;会在命令行中使用类似
的结果获得结果my_executable $(ls a* | egrep 'a[0-9]+$')
在$()中放置一个命令会将$()替换为该命令的输出。 希望有所帮助。