如何用另一个名称创建一个已经存在的目录

如何用另一个名称创建一个已经存在的目录

我想在我的主目录中创建名为“A”的目录,但我不知道这样的目录是否已经存在。我想编写一个命令来创建目录(如果目录不存在)。但是,如果该目录存在,该命令将创建一个同名的新目录,并添加一个小的内容来更改目录的名称。小的添加应该是随机的 - 也就是说,每次运行命令时,都会收到不同的添加。例如,该命令将创建目录“A15”或“A7”或任何此类附加目录,而不是“A”。可以假设添加的新目录不存在。如果原始目录“A”不存在但创建成功,或者消息“目录存在”,该命令将打印消息 !DONE。已创建一个新名称 A05,其中 A05 是新名称

答案1

我假设“没有bash脚本”意味着使用一系列命令或方便的 shell 函数。我会给你一个方便的 shell 函数。

此函数尝试创建给定名称的目录,并将使用不同的数字后缀重试,直到创建目录且没有错误为止。将从 1 到 99 的顺序测试数字索引。如果超出数字范围,则输出诊断消息,并且不创建目录。如果创建了目录,则其路径名将写入标准输出。

makedir () {
    local name="$1"
    local suffix=

    until mkdir -- "$name$suffix" 2>/dev/null; do
        suffix=$(( suffix + 1 ))
        if [ "$suffix" -eq 100 ]; then
            echo 'Cannot create directory' >&2
            return 1
        fi
    done

    printf '%s\n' "$name$suffix"
}

这会迭代使用until,直到mkdir命令成功。如果suffix计数器达到 100,则会将消息输出到错误流,并且该函数将返回非零退出状态。

可以将此函数定义添加到通常添加别名的位置。然后它将在您的下一个 shell 会话中可用。

如果您想要一个随机数而不是 1 到 99 范围内单调递增的数字:

makedir () {
    local name="$1"
    local tries=0
    local suffix=

    until mkdir -- "$name$suffix" 2>/dev/null; do
        tries=$(( tries + 1 ))
        if [ "$tries" -eq 100 ]; then
            echo 'Cannot create directory' >&2
            return 1
        fi
        suffix=$RANDOM
    done

    printf '%s\n' "$name$suffix"
}

这是几乎相同的函数,但它用作$RANDOM后缀,这将是某个整数。和以前一样,如果该函数在 100 次尝试内仍无法创建目录,则会退出。

如果这是为了创建一个临时目录,那么最好使用mktemp -d,而不是一些自制的东西。默认情况下,这将为您提供以下目录的名称/tmp

tmpdir=$( mktemp -d )

# Do some work beneath "$tmpdir".

# Then...
rm -r "$tmpdir"

相关内容