2015-08-29 111 views
1

我使用Matlab代碼,並希望在行之間插入Bash命令以選擇特定文件。使用Matlab的shell命令

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

該命令在shell中運行良好,但我很困惑我如何在Matlab代碼行之間使用它。

+0

使用'system'命令 – Daniel

+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

只是爲了完成安德拉斯·迪克的答案bang運營商也將工作:

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

該命令的輸出是一組目錄(/ files?)。你通常希望事後做一些事情,爲此你需要命令的輸出,只能用'系統'和朋友來捕捉。否則,這將是可取的,因爲'bang'可能沒有'system'的輸入混淆問題(我不知道,我總是使用'system',因爲我的命令包含變量,並且我總是需要輸出) –