感人的问题:从 2 个变量创建文件名

感人的问题:从 2 个变量创建文件名

我正在尝试从两个变量创建一个文件名。

这是错误消息:

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

正如其他人已经解释的那样,问题在于datemake中的斜杠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//\//_}"

相关内容