Linux mktemp的问题
我和MKTTEMP有问题。我写了一个剧本: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
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/*
的输出是什么?(带星号,这样我们就可以知道为什么德国劳埃德船级社