2013-04-26 70 views
0

我正在創建一個腳本,以便在OS X上運行,這將由新手用戶經常運行,因此希望每次創建一個新的目錄結構以保護n + 1最後:bash用連續號碼創建目錄

target001下一個運行創造target002

我到目前爲止有:

lastDir=$(find /tmp/target* | tail -1 | cut -c 6-) 
let n=$n+1 
mkdir "$lastDir""$n" 

然而,算算是不是在這裏工作。

回答

1

無管道和子流程:

targets=(/tmp/target*)    # all dirs in an array 
lastdir=${targets[@]: (-1):1}   # select filename from last array element 
lastdir=${lastdir##*/}     # remove path 
lastnumber=${lastdir/target/}   # remove 'target' 
lastnumber=00$((10#$lastnumber + 1)) # increment number (base 10), add leading zeros 

mkdir /tmp/target${lastnumber: -3}  # make dir; last 3 chars from lastnumber 

有兩個參數的一個版本:

path='/tmp/x/y/z'      # path without last part 
basename='target'      # last part 

targets=($path/${basename}*)   # all dirs in an array 
lastdir=${targets[@]: (-1):1}   # select path from last entry 
lastdir=${lastdir##*/}     # select filename 
lastnumber=${lastdir/$basename/}  # remove 'target' 
lastnumber=00$((10#$lastnumber + 1)) # increment number (base 10), add leading zeros 

mkdir $path/$basename${lastnumber: -3} # make dir; last 3 chars from lastnumber 
+0

I當聲明'lastdir'時得到'-bash:targets:bad array subscript'。我在OS X上使用GNU bash v3 – chop 2013-04-26 08:22:59

+0

謝謝。對於Bash 4.1及更低版本,這是正確的。解決方案改變 – 2013-04-26 08:54:59

+0

謝謝@fgm我還可以問「刪除路徑」代碼是如何工作的,因爲我需要在生產環境中使用不同的路徑。 – chop 2013-04-26 09:31:25

2

mktemp

 
Create a temporary file or directory, safely, and print its name. 
TEMPLATE must contain at least 3 consecutive `X's in last component. 
If TEMPLATE is not specified, use tmp.XXXXXXXXXX, and --tmpdir is 
implied. Files are created u+rw, and directories u+rwx, minus umask 
restrictions. 
+0

感謝您的支持。我很高興知道這一點。在這種情況下只關心隨機後綴而不是增量。不過'mktemp'肯定會有其他用處。 – chop 2013-04-26 04:28:34

0

像這樣:

lastDir=$(find /tmp/target* | tail -1) 
let n=1+${lastDir##/tmp/target} 
mkdir /tmp/target$(printf "%03d" $n) 
+0

我收到一個錯誤,因爲它似乎不想增加和'mkdir/tmp/target001' – chop 2013-04-26 06:04:27

2

使用此行來計算新的序列號:

... 
n=$(printf "%03d" $((10#$n + 1))) 
mkdir "$lastDir""$n" 

10#強制基地10 arithmetic。只要$ n已經是最後的安全保障,例如「001」。

+0

我得到'target001001'作爲這個 – chop 2013-04-26 08:36:01

+0

的結果我只專注於你的數學問題的答案。這意味着你必須自己做一些工作,比如提取** $ lastDir **(文件名減去序列,例如「/ tmp/target」)和** $ n **(例如「001」)。鑑於此,我的解決方案將增加序列,並確定目錄。 – svante 2013-04-26 13:21:49

+0

在此處重新編寫完整的解決方案:[http://stackoverflow.com/a/16239753/1207958](http://stackoverflow.com/a/16239753/1207958) – svante 2013-04-27 17:40:44

1

完整的解決方案中使用擴展測試[[和BASH_REMATCH:

[[ $(find /tmp/target* | tail -1) =~ ^(.*)([0-9]{3})$ ]] 
mkdir $(printf "${BASH_REMATCH[1]}%03d" $((10#${BASH_REMATCH[2]} + 1))) 

提供的/ tmp/target001是你的目錄模式。