我正在創建一個腳本,以便在OS X上運行,這將由新手用戶經常運行,因此希望每次創建一個新的目錄結構以保護n + 1最後:bash用連續號碼創建目錄
target001
下一個運行創造target002
我到目前爲止有:
lastDir=$(find /tmp/target* | tail -1 | cut -c 6-)
let n=$n+1
mkdir "$lastDir""$n"
然而,算算是不是在這裏工作。
我正在創建一個腳本,以便在OS X上運行,這將由新手用戶經常運行,因此希望每次創建一個新的目錄結構以保護n + 1最後:bash用連續號碼創建目錄
target001
下一個運行創造target002
我到目前爲止有:
lastDir=$(find /tmp/target* | tail -1 | cut -c 6-)
let n=$n+1
mkdir "$lastDir""$n"
然而,算算是不是在這裏工作。
無管道和子流程:
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
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.
感謝您的支持。我很高興知道這一點。在這種情況下只關心隨機後綴而不是增量。不過'mktemp'肯定會有其他用處。 – chop 2013-04-26 04:28:34
像這樣:
lastDir=$(find /tmp/target* | tail -1)
let n=1+${lastDir##/tmp/target}
mkdir /tmp/target$(printf "%03d" $n)
我收到一個錯誤,因爲它似乎不想增加和'mkdir/tmp/target001' – chop 2013-04-26 06:04:27
使用此行來計算新的序列號:
...
n=$(printf "%03d" $((10#$n + 1)))
mkdir "$lastDir""$n"
10#強制基地10 arithmetic。只要$ n已經是最後的安全保障,例如「001」。
我得到'target001001'作爲這個 – chop 2013-04-26 08:36:01
的結果我只專注於你的數學問題的答案。這意味着你必須自己做一些工作,比如提取** $ lastDir **(文件名減去序列,例如「/ tmp/target」)和** $ n **(例如「001」)。鑑於此,我的解決方案將增加序列,並確定目錄。 – svante 2013-04-26 13:21:49
在此處重新編寫完整的解決方案:[http://stackoverflow.com/a/16239753/1207958](http://stackoverflow.com/a/16239753/1207958) – svante 2013-04-27 17:40:44
完整的解決方案中使用擴展測試[[和BASH_REMATCH:
[[ $(find /tmp/target* | tail -1) =~ ^(.*)([0-9]{3})$ ]]
mkdir $(printf "${BASH_REMATCH[1]}%03d" $((10#${BASH_REMATCH[2]} + 1)))
提供的/ tmp/target001是你的目錄模式。
I當聲明'lastdir'時得到'-bash:targets:bad array subscript'。我在OS X上使用GNU bash v3 – chop 2013-04-26 08:22:59
謝謝。對於Bash 4.1及更低版本,這是正確的。解決方案改變 – 2013-04-26 08:54:59
謝謝@fgm我還可以問「刪除路徑」代碼是如何工作的,因爲我需要在生產環境中使用不同的路徑。 – chop 2013-04-26 09:31:25