2013-04-26 64 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是你的目录模式。