使用Matlab的shell命令

时间:2015-08-29 11:48:47

标签: bash matlab ubuntu

我使用Matlab代码,并希望在行之间插入Bash命令以选择特定文件。

du --max-depth 1 |
awk -v q='"' '$1 < 30000000 && $2 != "." {sub(/^[0-9\t ]+/, "", $0); print q $0 q}'

这个命令在shell中运行良好,但我很困惑如何在Matlab代码行之间使用它。

2 个答案:

答案 0 :(得分:6)

在linux下,systemunix执行相同操作:它们在shell中评估其字符串参数。为此,你必须通过MATLAB的字符串语法来避开单引号,你可以通过将每个单引号加倍来实现:

[~,output]=system('du --max-depth 1 | awk -v q=''"'' ''$1 < 30000000 && $2 != "." {sub(/^[0-9\t ]+/, "", $0); print q $0 q}''');

这会将命令的输出保存到名为output的字符串中。第一个输出参数是状态代码。虽然,根据后续应用程序,您可能希望完全删除输出中的双引号(即在结尾处省略变量qprint $0)。

由于您的output现在是一个字符向量,只需将新行包含为\n字符,您必须进行一些后处理才能获得有意义的文件名。最简单的方法是使用regexp在换行符处拆分字符串,然后记住由于字符串末尾的最后一个换行符而丢弃最后一个(空)字符串。如果你留意我关于双引号的建议,请按照以下步骤操作:

[~,output] = system('du --max-depth 1 | awk ''$1 < 30000000 && $2 != "." {sub(/^[0-9\t ]+/, "", $0); print $0}''');
filelist = regexp(output,'\n','split'); %split at newline
filelist = filelist(1:end-1); %throw away the last dubious part

现在filelist是一个单元格数组,每个元素都包含一个字符串:脚本输出的每个对象的名称。

但请注意:通常从命令窗口输入会将输入变为system调用,就像来自STDIN一样。见this important post。原则上,您可以通过将系统命令的STDIN重定向到/dev/null来解决部分此问题,如du --max-depth 1 </dev/null | awk ...中所述,但我发现这不是一般解决方案。

答案 1 :(得分:1)

只需完成Andras Deak的回答,bang运算符也会起作用:

!du --max-depth 1 |
awk -v q='"' '$1 < 30000000 && $2 != "." {sub(/^[0-9\t ]+/, "", $0); print q $0 q}'