【问题标题】:bash create dir with sequential numbersbash 创建带有序号的目录
【发布时间】:2013-04-20 03:08:20
【问题描述】:

我正在创建一个在 OS X 上运行的脚本,该脚本将由新手用户经常运行,因此希望通过每次创建一个新的目录结构来保护目录结构,并在最后一个 n+1:

target001 下一次运行创建target002

到目前为止:

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

但是,数学在这里不起作用。

【问题讨论】:

    标签: macos bash mkdir


    【解决方案1】:

    怎么样 mktemp?

    安全地创建一个临时文件或目录,并打印其名称。 TEMPLATE 必须在最后一个组件中包含至少 3 个连续的“X”。 如果没有指定 TEMPLATE,使用 tmp.XXXXXXXXXX,--tmpdir 是 默示。创建文件 u+rw,目录 u+rwx,减去 umask 限制。

    【讨论】:

    • 谢谢。我很高兴知道这一点。在这种情况下,唯一需要关注的是随机后缀而不是增量。不过,mktemp 对我来说肯定还有其他用途。
    【解决方案2】:

    使用这一行计算新的序列号:

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

    10# 强制基数为 10 arithmetic。已经提供了 $n 的最后一个 secuence,例如“001”。

    【讨论】:

    • 我因此得到target001001
    • 我的答案只集中在你的数学问题上。 ... 意味着您必须自己做一些工作,例如提取 $lastDir(文件名减去序列,例如“/tmp/target”)和 $n(例如“001 ”)。鉴于此,我的解决方案将增加序列并 mk 目录。
    • 在这里重新编写完整的解决方案:http://stackoverflow.com/a/16239753/1207958
    【解决方案3】:

    没有管道和子进程:

    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
    

    带有 2 个参数的版本:

    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
    

    【讨论】:

    • 我在声明 lastdir 时得到 -bash: targets: bad array subscript。我在 OS X 上使用 GNU bash v3
    • 谢谢。这适用于 Bash 4.1 及更低版本。解决方案已更改。
    • 谢谢@fgm 能否请教一下“删除路径”代码是如何工作的,因为我需要在生产环境中使用不同的路径。
    • 我为任意路径添加了第二个版本。
    • 我现在明白了,谢谢@fgm。我在学。我必须使用 unset 才能得到我在测试中看到的奇怪结果。
    【解决方案4】:

    使用扩展测试 [[ 和 BASH_REMATCH 的完整解决方案:

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

    假设 /tmp/target001 是您的目录模式。

    【讨论】:

      【解决方案5】:

      像这样:

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

      【讨论】:

      • 我收到了一个错误,因为它似乎不想增加和mkdir /tmp/target001
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 2013-02-12
      • 1970-01-01
      相关资源
      最近更新 更多