2013-07-31 67 views
0

我每次在工作目錄中運行腳本時都會生成文件(testfile)。我必須將生成的文件複製到目錄(testfolder)並使其增加一個.ext用於增加擴展名的Unix shell腳本

如果腳本第一次運行,則將測試文件複製到testfolder作爲「testfile.0」,並在第二次運行時將測試文件複製到testfolder作爲「testfile.1」等等。

我的腳本:

#!/bin/sh 

file="testfile" 
n=1 

ls folder/${file}* | while read i 
do 
    if [ folder/${file}.${n} = ${i} ] 
    then 
    n=$(($n + 1)) 
fi 
done 

cp testfile folder/${file}.${n} 

這只是第一個增量「的文件夾/ testfile.0」

回答

1

的問題是,你的while循環在由於使用的執行殼層工作一個管道,所以你的修改n不按預期工作。

在一般情況下,你可以使用process substitutionwhile來避免這個問題,但在當前情況下一種簡單for循環是正確的做法:

#!/bin/sh 

file="testfile" 
n=1 

for i in folder/${file}* 
do 
    if [ folder/${file}.${n} = ${i} ] 
    then 
    n=$(($n + 1)) 
fi 
done 

cp testfile folder/${file}.${n} 
2

我不會糾正你的解決方案,因爲mklement0做得很好。

這裏是另一種解決方案,無需任何循環:

file="testfile" 
n_max=$(ls -1 "folder/${file}"* | egrep -o '[0-9]+$' | sort -rn | head -n 1) 
cp "${file}" "folder/${file}.$((n_max+1))" 

這裏是第二行的事情:首先你列出的文件,然後egrep提取數字擴展,然後sort -rg各種各樣他們遞減,而去年head只捕捉第一行,即最大使用的索引。最後,在第三行中,你添加一個到這個最大值來建立你的新索引。如果列表爲空,那我的腳本就可以了。

順便說一句,列出一個目錄可能會很長,所以我建議你將最後一個索引存儲在某個地方以備後用。將它作爲一個變量保存在腳本中,或者甚至保存在一個文件中......它可以爲您節省一些時間。

+0

做得好;你能否刪除第二行'='周圍的空格?他們違反命令。 A quibble:數學表達式的''[]'語法顯然已被棄用(參見http://wiki.bash-hackers.org/syntax/expansion/arith);因此,'$((n_max + 1))'是更安全的選擇 另外:如果在排序時處理整數的字符串表示,'-n'('--numeric-sort')顯然比' -g'('--general-numeric-sort') - 參見http://stackoverflow.com/a/1255800/45375 – mklement0

+0

@ mkelement0:非常感謝您提出的寶貴意見,所做的更改已完成。 – Bentoy13

+0

我的榮幸。您的解決方案是OP方法的絕佳替代方案;它促使我研究''[]'構造(我以前從未見過)和(最後,總是想知道)'sort'的'-n'和'-g'選項之間的區別。 – mklement0

0

又一個建議 - 在易於理解的代碼:

#!/bin/bash 

file="testfile" 
n=1 

# Check for existing files with filename and count it 
n=$(ls -latr folder/ |grep -i ${file} | wc -l) 

# Increment above number 
n=$(($n + 1)) 

# Copy over file with the incremented number 
cp $file folder/${file}.${n}