mktemp的问题

时间:2012-06-08 21:27:24

标签: linux bash unix

我遇到mktemp问题。我写了一个剧本:

tempdir=$(mktemp -t -d mytemp.XXXXXX)

mv ~/Desktop/File_Converted/* "$tempdir"

cd $tempdir

for f in *; do

    Some stuff...

done

当我跑步时,我得到:

$ ~/Desktop/script.sh 
mv: rename /Users/user/Desktop/File_Converted/* to /var/folders/xE/xEV9UA-AFpOdJkN2IrTAArI6Gs/-Tmp-/-d.eiXRhaHY\nmytemp.caNEzp: No such file or directory
/Users/user/Desktop/script.sh: line 21: cd: /var/folders/xE/xEV9UA-AFpOdJkN2IrTAArI6Gs+/-Tmp-/-d.eiXRhaHY: Not a directory

我似乎无法找到我做错了什么。有什么帮助吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

您已将-t-d混为一谈。

mktemp的-t参数接受一个参数,在你的情况下,它接受-d。因此,您获得的是文件名而不是目录,mv失败。

错误令人困惑,因为mktemp正在使用您想要的模板(mytemp.XXXXXX),而会根据它生成临时名称。这就是你在错误信息中得到\n的原因,mktemp的输出实际上是两行。

相关文档:

  

mktemp [ -d ] [ -q ] [ -t 前缀] [ - 你]模板......

     

-d 制作目录而不是文件。

     

-t 前缀
               生成模板(使用提供的前缀和TMPDIR,如果设置)                创建文件名模板。

根据你的评论,
对于调试,我建议打印$tempdir的值,看看它是否符合您的预期。你似乎仍然得到两个mv错误,这表明我有些不对劲。

bash导致脚本在遇到错误后停止的set -e命令在跟踪此类问题时也非常方便。

答案 1 :(得分:1)

根据您的第一个错误(mv: rename /Users/user/Desktop/File_Converted/* to ...),看起来/Users/user/Desktop/File_Converted可能为空,因此glob不会扩展到文件列表,而是被视为文字字符串。

编辑:看下面的评论,我注意到你的tiff文件名称中有一个空格:

Dan-Dows-MacBook-Pro:tmp ddow$ ls ~/Desktop/File_Converted/ inbox.tiff

这会引起问题。将此单mv替换为:

files_to_move=(~/Desktop/File_Converted/*)
mv "${files_to_move[@]}" $tempdir.

第一行创建一个数组变量,其中每个元素都是File_Converted的文件名,并且每个文件名中的空格都被正确保留。在第二行, 我们在引号中使用参数扩展来扩展到文件名列表(再次,在分词后正确保留文件名中的空格),然后将其移动到$tempdir

答案 2 :(得分:0)

我认为mktemp在OSX上有点不同。它正在尝试使用前缀$TMPDIR创建您的临时目录,如果您执行echo $TMPDIR,则会看到/var/folders/...

您只需使用,例如mktemp /tmp/mytemp.XXXXXX