我使用Matlab代码,并希望在行之间插入Bash命令以选择特定文件。
du --max-depth 1 |
awk -v q='"' '$1 < 30000000 && $2 != "." {sub(/^[0-9\t ]+/, "", $0); print q $0 q}'
这个命令在shell中运行良好,但我很困惑如何在Matlab代码行之间使用它。
答案 0 :(得分:6)
在linux下,system
和unix
执行相同操作:它们在shell中评估其字符串参数。为此,你必须通过MATLAB的字符串语法来避开单引号,你可以通过将每个单引号加倍来实现:
[~,output]=system('du --max-depth 1 | awk -v q=''"'' ''$1 < 30000000 && $2 != "." {sub(/^[0-9\t ]+/, "", $0); print q $0 q}''');
这会将命令的输出保存到名为output
的字符串中。第一个输出参数是状态代码。虽然,根据后续应用程序,您可能希望完全删除输出中的双引号(即在结尾处省略变量q
和print $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}'