0

我在使用 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

我似乎找不到我做错了什么。请问有什么帮助吗?

谢谢!

4

3 回答 3

3

你把你的-t和你的-d搞混了。

mktemp的-t参数需要一个参数,在你的情况下它需要-d. 因此,您得到的是文件名而不是目录,并且mv失败了。

该错误更加令人困惑,因为 mktemp 正在使用您想要的模板 ( mytemp.XXXXXX),并且基于它生成一个临时名称。这就是为什么您\n在错误消息中有一个原因,mktemp 的输出实际上是两行长。

相关文档:

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

-d 创建目录而不是文件。

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

根据您的评论,
对于调试,我建议打印 的值$tempdir并查看它是否符合您的预期。您似乎仍然遇到两个 mv 错误,这向我表明出了点问题。

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

于 2012-06-08T21:33:28.093 回答
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.

于 2012-06-08T21:54:32.653 回答
0

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

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

于 2012-06-08T21:58:07.947 回答