我正在尝试从两个变量创建一个文件名。
这是错误消息:
touch: cannot touch `/root/tinstalls/2--06/06/15': No such file or directory
2--06/06/15 19:54
这是代码:
tdate=$(date '+%D %R')
tfile=$(echo "${toadd}--${tdate}")
touch /root/tinstalls/${tfile}
echo $tfile
目录就在那里。
答案1
@Theophrastus 有正确的想法。根据POSIX“组成[文件]名称的字符可以从所有字符值的集合中选择排除斜杠字符和空字节”(我的重点)。换句话说,每个字符串之间两个斜杠(除了空字符串) 是另一个目录,你不能创建一个名称包含斜杠的文件。因此,当您尝试这样做时touch /root/tinstalls/2--06/06/15
,系统会尝试15
使用绝对路径在目录中创建文件/root/tinstalls/2--06/06
。
修改此问题的一个简单方法是将文件名中的所有斜杠替换为下划线:
touch "/root/tinstalls/${tfile//\//_}"
答案2
touch 无法创建目录。例如 看这里
我看到你有“目录就在那里”。但您确实意识到您的日期格式包含“/”字符,这将需要更多目录,是吗?
答案3
正如其他人已经解释的那样,问题在于date
make中的斜杠touch
尝试创建一个目录。既然它不能,它就会抱怨。最简单的解决方案是更改日期格式。而不是这个:
$ date '+%D %R'
06/07/15 13:47
用这个:
$ date '+%F %R'
2015-06-07 13:52
或者,更好的是,避免处理空格并使用它:
$ date '+%F-%R'
2015-06-07-13:52
最后,如果您坚持要包含空格,则在将其传递给时必须引用该名称touch
touch /root/tinstalls/"${toadd}--$(date '+%F %R')"
答案4
@Theophrastus 有正确的想法。根据 POSIX,“组成[文件]名称的字符可以从除斜杠字符和空字节之外的所有字符值集中选择”(我的重点)。换句话说,两个斜杠之间的每个字符串(空字符串除外)都是另一个目录,并且您无法创建名称包含斜杠的文件。因此,当您尝试触摸 /root/tinstalls/2--06/06/15 时,系统会尝试在绝对路径 /root/tinstalls/2--06/06 的目录中创建文件 15。
修改此问题的一个简单方法是将文件名中的所有斜杠替换为下划线:
touch "/root/tinstalls/${tfile//\//_}"