【发布时间】:2014-04-17 04:25:31
【问题描述】:
所以我试图写入一个文件,我希望我的文件名是我打开它的时间。我有这样的事情:
var=$(date +"%D-%H:%M:%S")
echo "I opened a file" > $var
cat $var
当我尝试运行这段代码时,它给了我错误:
NO SUCH FILE OR DIRECTORY
谁能告诉我这是怎么回事?
【问题讨论】:
所以我试图写入一个文件,我希望我的文件名是我打开它的时间。我有这样的事情:
var=$(date +"%D-%H:%M:%S")
echo "I opened a file" > $var
cat $var
当我尝试运行这段代码时,它给了我错误:
NO SUCH FILE OR DIRECTORY
谁能告诉我这是怎么回事?
【问题讨论】:
你应该在你的变量中使用引号:
var="$(date +"%d-%m-%Y-%H:%M:%S")"
echo "I opened a file" > "$var"
cat "$var"
编辑:您的问题是在您的日期变量中使用斜杠 / 使 shell 认为它是路径而不是文件名。您需要按照我上面的建议更改日期格式。
【讨论】:
exec 3> "${var}"; ... echo "something" >&3来获得一些效率...这将在你的日志中节省很多打开/附加/关闭周期文件只打开一次,然后重复写入适当的文件描述符。但是,根据您的用例,可能没有必要......
那是因为您的重定向是到文件名“:”,而文件名的其余部分被单词拆分为以下参数。 Use more quotes.
另一个问题是您无法创建包含斜杠的文件名。当然,这是一个目录结构。您将需要用其他东西替换斜线。您可以通过修改date 命令来做到这一点,但使用parameter expansion 也很容易,如下所示:
var=$(date +"%D-%H:%M:%S")
$ echo "$var"
03/12/14-15:20:46
$ echo 'data' > "${var//\//_}" # replace slashes with underscores
如果您只是想创建带日期戳的文件,请考虑使用epoch timestamp:
var=$(date +%s)
echo "$somedata" > "$var"
机器很容易将值与纪元时间戳相互转换,而且对于您和大多数用户来说,处理由数字字符串组成的文件名比处理人类可读的时间戳更容易。
【讨论】: