带有 mkdir 的 Stata 可移植代码

Stata portable code with mkdir

所以,我正在尝试编写一行代码来检查是否存在目录,如果不存在则仅尝试创建目录。在 Statalist 上找到这个:

local name test_directory
cd C:\
capture confirm file "./`name'/nul" // check if `name' subdir exists
if _rc { // _rc will be >0 if it doesn't exist
    !md "`name'"
    }

// my do file
save "C:/`name'/current_data.dta"  // optionally add -,replace-

我的应用程序总体上看起来非常可靠,但我正在努力将其转换为 Mac 兼容的语法。

local name test_directory
cd ~/
capture confirm file "./`name'/*" 
// check if `name' subdir exists
if _rc { 
    mkdir "`name'"
    }

关于如何正确执行此操作的任何建议?

我通常使用 shell 来处理这样的事情:

local name test_directory
cd ~
!if test -d `name'; then echo "`name' Already Exists"; else mkdir `name'; fi

我真的不明白为什么你的第二个代码失败了。

问题是捕获语句末尾的星号:如果 test_directory 存在但为空,则不会匹配任何内容且 _rc 将为非零。也许你的意思是星号是“。”?

但是那个字符之前的斜杠也是一个问题:如果存在名为 test_directory 的普通文件,确认将失败,因为 "test_directory/." 不存在,但 mkdir 也会因为名称而失败冲突。

以下对我有用,OS X 10.10 上的 Stata 13.1,有一些额外的输出用于调试以确认我采用的路径。

local name test_directory
cd "~/Research/Stata sandbox"
capture confirm file "./`name'" 
// check if `name' subdir exists
if _rc { 
    mkdir "`name'"
    display "`name' created"
    }
else {
    display "`name' already exists"
    }

您可以尝试依赖 cd 命令的 return 代码。这是confirmdir(来自SSC)采取的方法:

local somedir /home/roberto/Desktop/test

quietly capture cd `"`somedir'"'
if (_rc) display as text "return code `=_rc'; do something, like mkdir"
else display as text "could change dir; the dir exists"

如果

这将发出信号

cd was unable to change to the directory you typed because either it does not exist, it is protected, or it is not a directory

来源:search r(170).

如果您计划在条件语句之后发出多个命令,那么您需要 if {...} else {...} 语法。参见 help ifcmd

如果不想在不同的目录下结束,可以在开头保存当前目录

local cwd `"`c(pwd)'"'

完成后切换回它:

quietly cd `"`cwd'"'

它应该适用于 MS Windows 和 Unix 类型 OS。 (但我无法在 MS Windows 上进行测试。)

以下适用于所有平台

local dir_to_use "whatever_dir_name"
capture mkdir "`dir_to_use'"

如果目录已经存在,就不会发生任何问题。

有些人可能会发现这个简单的 do-file 解决方案很方便:

local name test_directory

capture mkdir "C:/`name'/"

save "C:/`name'/current_data.dta"

如果此文件夹不存在,这将创建一个名为 test_directory 的文件夹。如果文件夹已经存在,代码也可以正常运行。