Linux mktemp的问题

Linux mktemp的问题,linux,bash,unix,Linux,Bash,Unix,我和MKTTEMP有问题。我写了一个剧本: 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/fo

我和MKTTEMP有问题。我写了一个剧本:

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
我似乎找不到我做错了什么。需要帮忙吗

谢谢


丹,你把你的
-t
-d
搞混了

mktemp的
-t
参数接受一个参数,在您的例子中,它接受
-d
。因此,您得到的是文件名而不是目录,
mv
失败

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

相关文件:

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

-d创建目录而不是文件

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

根据您的评论,
对于调试,我建议打印
$tempdir
的值,看看它是否符合您的预期。你看起来仍然有两个mv错误,这对我来说意味着出了问题


set-e
命令用于bash,该命令会导致脚本在遇到错误后停止,在跟踪类似问题时也非常方便。

您的
-t
-d
混淆了

mktemp的
-t
参数接受一个参数,在您的例子中,它接受
-d
。因此,您得到的是文件名而不是目录,
mv
失败

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

相关文件:

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

-d创建目录而不是文件

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

根据您的评论,
对于调试,我建议打印
$tempdir
的值,看看它是否符合您的预期。你看起来仍然有两个mv错误,这对我来说意味着出了问题

set-e
命令用于bash,该命令会导致脚本在遇到错误后停止,也可以非常方便地跟踪此类问题。

根据您的第一个错误(
mv:rename/Users/user/Desktop/File\u Converted/*to…
),它看起来像
/Users/user/Desktop/File\u 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\u转换而来的文件名,并且每个文件名中的空格都被正确保留。在第二行,
我们使用引号中的参数展开来展开文件名列表(同样,在分词后适当地保留文件名中的空格),然后根据您的第一个错误(
mv:rename/Users/user/Desktop/file\u Converted/*to…
)将其移动到
$tempdir

),看起来,
/Users/user/Desktop/File\u 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\u转换而来的文件名,并且每个文件名中的空格都被正确保留。在第二行,

我们使用引号中的参数展开来展开文件名列表(同样,在分词后适当地保留文件名中的空格),然后将其移动到
$tempdir

我认为
mktemp
在OSX上的工作方式有点不同。它试图用前缀
$TMPDIR
创建您的临时目录,如果您这样做
echo$TMPDIR
,您将看到它是
/var/folders/…


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

我认为
mktemp
在OSX上的工作方式有点不同。它试图用前缀
$TMPDIR
创建您的临时目录,如果您这样做
echo$TMPDIR
,您将看到它是
/var/folders/…


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

就可以从发布的脚本中获取错误消息。另外,您需要在
cd
命令中引用变量。
ls-l~/Desktop/File\u Converted/*
的输出是什么?(带星号,因此我们可以找出glob不能与
mv
一起工作的原因)另外两个长期建议:
GLOBIGNORE
的值是什么,以及如果在执行
shopt-s failglob
后运行脚本会发生什么?您无法从发布的脚本中获得错误消息。另外,您需要在
cd
命令中引用变量。
ls-l~/Desktop/File\u Converted/*
的输出是什么?(带星号,这样我们就可以知道为什么德国劳埃德船级社