我使用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代碼行之間使用它。
我使用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代碼行之間使用它。
在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 ...
,但我發現這不是一個通用的解決方案。
只是爲了完成安德拉斯·迪克的答案bang
運營商也將工作:
!du --max-depth 1 |
awk -v q='"' '$1 < 30000000 && $2 != "." {sub(/^[0-9\t ]+/, "", $0); print q $0 q}'
該命令的輸出是一組目錄(/ files?)。你通常希望事後做一些事情,爲此你需要命令的輸出,只能用'系統'和朋友來捕捉。否則,這將是可取的,因爲'bang'可能沒有'system'的輸入混淆問題(我不知道,我總是使用'system',因爲我的命令包含變量,並且我總是需要輸出) –
使用'system'命令 – Daniel
難道我的回答解決問題了嗎?如果是這樣,請考慮標記爲已接受:) –