2015-11-14 62 views
1

我需要在我的C++代碼以執行該命令: MKDIR -p sample_directory/{1..10} 使10個目錄。但是,當我在我的代碼中使用它的系統功能:使用C++系統();不工作

system("mkdir -p sample_director/{1..10}"); 

執行後,這個這個名字只是做一個目錄:{} 1..10 我怎樣才能解決這個問題?

+0

我還沒有使用{1..10}創建目錄。試試{1,2,3,4,5,6,7,8,9,10}?這是否工作? – faadi

+0

它不起作用,我的目錄名是:{1,2,3,4,5,6,7,8,9,10}, – Unix2000

回答

1

Brace擴展不在POSIX中,所以不是所有的shell都實現它。特別是在POSIX中,system應該調用sh,它應該像「普通」POSIX shell而不是bash或其他一些功能豐富的shell一樣。所以它不會做大括號擴展。

你可以直接調用bash,如果你想bash處理命令

system("bash -c 'mkdir -p sample_director/{1..10}'"); 

,或者你可以只讓10個獨立system電話。或者其他解決方法,我相信你可以想到一些。

+0

謝謝:-)它的工作 – Unix2000

+0

或更好的,10個單獨的'mkdir'調用。 – ninjalj

+0

@ninjalj您無法將'-p'選項傳遞給'mkdir'函數。 – Brian

1

你可以嘗試使用循環結構來做同樣的事情。

# include <cstdlib> 
# include <string> 

using namespace std; 

int main(){ 
    for(int i=1;i<=10;i++){ 
     string str="mkdir -p sample_director/" + to_string(i); 
     system(str.c_str()); 
    } 
    return 0; 
} 

而且隨着c++11支持

$ g++ -std=c++11 my_program.cpp 
0

它不起作用,因爲dash不支持括號擴展(語法像{1..10})運行代碼。 system函數不關心SHELL的值,它總是將提供的參數傳遞給/bin/sh。而在Ubuntu /bin/sh指的是dash,它無法處理大括號擴展。在其他一些發行版(如Arch)上,/bin/sh是符號鏈接bash,所以您的代碼將正常工作。

如果我是你,在這種情況下根本不會使用systemBoost::filesystem(或者甚至mkdir/mkdirat)對我來說似乎是更好的選擇。