4

我想创建脚本,其中新生成的目录自动将当前时间作为名称的一部分。

句法

mkdir mydir[min-hour-day-month-year]

因此最近的目录将被命名为

mydir101718052012

一小时后创建的目录

mydir111718052012

等等。

很抱歉这个简单的问题,我是 unix 新手,我使用 bash

编辑:为什么不遵循正确?我该怎么做 ?

newdir = mydir$( date +%Y-%m-%d-%H-%M-%S)
cp new.txt newdir/new1.txt
4

2 回答 2

6

如果您的 date 实现支持这些选项,您可以简单地执行以下操作:

mkdir mydir$( date +%M%H%d%m%Y )

请注意,这不会根据您的示例输出在名称中插入连字符。要获得初始描述中的连字符:

mkdir mydir$( date +%M-%H-%d-%m-%Y )
于 2012-05-18T14:22:00.540 回答
3

我在我的 bash 启动脚本中设置了以下函数:

# Date Time Stamp
dts() { date +%Y-%m-%d-%H-%M-%S; }

# Date mkdir
dmkdir() { mkdir $(dts); }

我主要在命令行上使用它们,如果你想在脚本中运行它们,你必须获取启动脚本或在脚本中定义 shell 函数。如果你想在前面加上一个名字(例如mydir),你可以很容易地给它一个像这样的参数:

# Date mkdir
dmkdir() { mkdir "$@$(dts)"; }

这将被称为:

$ dmkdir mydir
$ ls -d mydir*
mydir2012-05-18-11-38-40

这确实意味着如果您的参数列表包含空格,它们将显示在目录名称中,这可能是也可能不是一件好事。

您可以在 shell 函数内部分配一个 shell 变量,这可以在函数外部访问:

dmkdir() { newdir="$@$(dts)"; mkdir $newdir; }

像这样使用:

$ dmkdir mydir
$ cd $newdir
$ pwd
/tmp/mydir2012-05-18-12-54-32

这非常方便,但是您必须注意以下几点:1)您正在污染您的命名空间——您可能会覆盖一个名为$newdir由不同进程创建的 shell 变量 2)很容易忘记哪个变量 dmkdir 将写入,特别是如果你有很多 shell 函数写出变量。一个好的命名约定将对这两个问题有很大帮助。

另一种选择是让 shell 函数回显目录名称:

dmkdir() { local newdir="$@$(dts)"; mkdir $newdir && echo $newdir; }

这可以如下调用:

newdir="$(dmkdir mydir)"

local意味着这$newdir在 dmkdir 之外不可用,这是一件好事(TM)。

的使用&&意味着只有在目录创建成功时才回显目录的名称。

$()语法允许您加载任何回显到 STDOUT 的内容以加载到变量中,并且单引号确保如果目录名称中有任何空格,它仍然会加载到单个变量中。

这解决了先前解决方案中固有的命名空间污染问题。

于 2012-05-18T15:34:45.787 回答