我遇到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
我似乎无法找到我做错了什么。有什么帮助吗?
谢谢!
丹
答案 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