2016-12-28 21 views
1

我試圖在我的Fortran 90代碼中包含一個命令,將某個文件複製到備份位置。如果我只是複製文件,代碼會在bash中的一個班輪複製文件的數字附加到文件名

cp -f myfile.nml output/codebkp/myfile.nml 

但我一直在尋找的東西,如果有以前的文件,可以鑑別。例如,如果該文件以前不存在,則將其複製到myfile.nml.00。如果該目錄已經有一個myfile.nml.02它將它複製到myfile.nml.03等等。

它必須是一個班輪,因爲我把它放到我的Fortran代碼中,所以我被迫(我認爲)使用CALL SYSTEM()聲明。

我能夠做到的最好的嘗試是一樣的東西

cp myfile.nml output/codebkp/myfile.nml.$((`ls output/codebkp/myfile.nml.* | awk '{print $NF}' | awk -F '.' '{print $NF}'`+1)) 

但是,這給了我時,有沒有文件中的錯誤(但令人驚訝的是還有種與錯誤的原理偶數),並且不工作了後兩個文件,給我這個錯誤

bash: 1 
2+1: syntax error in expression (error token is "2+1") 

任何想法?順便說一下,我在Fortran上這樣做,因爲我知道沒有更好的方法可以從那裏做到這一點。但是,如果有更好的方法來做到這一點,請與CALL SYSTEM()聯繫,請讓我知道!

+0

你不能(在Fortran語言的)根本與諮詢按文件名的圈,還是有一個是bash的? – francescalus

+1

您可以編寫多行bash(或Python或其他)腳本並將其保存到文件中,然後使用fortran的單行命令調用該文件。 –

+0

@francescalus我真的不知道fortran很好。我想我可以,但我只是不知道該怎麼做。我幾乎沒有使用fortran的經驗 – TomCho

回答

0

在我的bash(GNU bash,版本4.4.5)中,第一次命令工作正常。

$ls 
>Desktop Documents Downloads Music myfile.nml.02 Pictures Public Templates Videos 
$cp myfile.nml.02 myfile.nml.$((`ls myfile.nml.* |awk '{print $NF}' |awk -F'.' '{print $NF}'` + 1)) 
$ls 
>Desktop Documents Downloads Music myfile.nml.02 myfile.nml.3 Pictures Public Templates Videos 

但第二次沒有工作。 LS跟所有的nml文件都是一樣的,中間的awk並沒有像你希望的那樣隔離最後一個文件。

$ls myfile.nml.* |awk '{print $NF}' |awk -F'.' '{print $NF}' 
>02 
>3 

如果你用尾巴-1代替中間的awk應該可以工作。

$ls myfile.nml.* |tail -1 |awk -F'.' '{print $NF}' 
>3 
$cp myfile.nml.3 myfile.nml.$((`ls myfile.nml.* |tail -1 |awk -F'.' '{print $NF}'` + 1)) 
$ls myfile.nml.* 
>myfile.nml.02 myfile.nml.3 myfile.nml.4 

PS:心靈缺少零....

+0

@TomCho這是否適合您? –

+0

是的,我實際上獨立到達這個版本,其中包括零:''「max ='ls output/codebkp/param.nml。* | tail -1 | awk -F'。' '{print $ NF}''; max = $ {max#0};& !&cp param.nml output/codebkp/param.nml.'printf'%02d'$((max + 1))''' ' – TomCho

相關問題