我正在创建一个脚本,以便在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