带有 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 的文件夹。如果文件夹已经存在,代码也可以正常运行。
所以,我正在尝试编写一行代码来检查是否存在目录,如果不存在则仅尝试创建目录。在 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 的文件夹。如果文件夹已经存在,代码也可以正常运行。