我使用Matlab代码,并希望在行之间插入Bash命令以选择特定文件.
du --max-depth 1 |
awk -v q='"' '$1 < 30000000 && $2 != "." {sub(/^[0-9\t ]+/, "", $0); print q $0 q}'
Run Code Online (Sandbox Code Playgroud)
这个命令在shell中运行良好,但我很困惑如何在Matlab代码行之间使用它.
在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}''');
Run Code Online (Sandbox Code Playgroud)
这会将命令的输出保存到名为的字符串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
Run Code Online (Sandbox Code Playgroud)
现在filelist是一个单元格数组,每个元素都包含一个字符串:脚本输出的每个对象的名称.
但请注意:通常从命令窗口输入会使system调用的输入变为乱码,就像从STDIN那样.看到这篇重要的帖子.原则上,您可以通过将系统命令的STDIN重定向到/dev/null,来修复此问题du --max-depth 1 </dev/null | awk ...,但我发现这不是一般解决方案.
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |