bash - 使用 Matlab 中的 shell 命令

标签 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 代码行之间使用它。

最佳答案

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 的字符串中。 .第一个输出参数是状态码。虽然,根据后续应用程序,您可能希望完全从输出中删除双引号(即,省略变量 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 ... ,但我发现这不是一个通用的解决方案。

关于bash - 使用 Matlab 中的 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32285715/

相关文章:

matlab - 计算像素邻域的最快方法

node.js - 我从源代码安装了 Node-12 但无法获取 nodejs --version

ruby-on-rails - 打开 gem,使用 Rubymine

bash - 你如何将 ls 的输出发送到 mv?

linux - 以 5 秒的步骤更改 bash 脚本倒计时延迟

linux - scp + 如果相同的文件名位于远程机器上,避免复制?

Firefox ubuntu 上的 jquery 幻灯片闪烁/闪烁问题

linux - 如何使 bash 命令回显线变为绿色

python - 你能在 python 中复制 matlab 的旧伪随机数生成器吗?

algorithm - 通过内置命令在matlab中计算所有N位字符串