For loop 文件终端命令是否包含/*-如何防止该命令注释掉进一步的工作?
因此,我知道For loop 文件终端命令是否包含/*-如何防止该命令注释掉进一步的工作?,for-loop,terminal,stata,For Loop,Terminal,Stata,因此,我知道mv更适合移动文件,因此在Stata中,我希望将名称中包含特定年份的所有文件移动到它们自己的目录中。但是,当我在中包含/*时终端命令,它在do文件中注释掉我的其余工作。有办法解决这个问题吗 以下是有关章节: forvalues i = 2010/2013 { !mkdir ~/Documents/Thesis/Data/EIA_AMI/Test/`i' !mv ~/Documents/Thesis/Data/EIA_AMI/Test/*`i'* ~/Documents
mv
更适合移动文件,因此在Stata中,我希望将名称中包含特定年份的所有文件移动到它们自己的目录中。但是,当我在中包含/*
时代码>终端命令,它在do文件中注释掉我的其余工作。有办法解决这个问题吗
以下是有关章节:
forvalues i = 2010/2013 {
!mkdir ~/Documents/Thesis/Data/EIA_AMI/Test/`i'
!mv ~/Documents/Thesis/Data/EIA_AMI/Test/*`i'* ~/Documents/Thesis/Data/EIA_AMI/Test/`i'/
}
如果用引号括起来不起作用,请使用char()
函数尝试ASCII代码
我的机器上的一个工作示例是:
clear all
set more off
forvalues i = 2010/2010 {
!mkdir ~/Desktop/test/`i'
!mv /home/roberto/Desktop/test/`=char(42)'`i'`=char(42)'.txt /home/roberto/Desktop/test/`i'/
}
与
结果是:
运行示例:
. local i = 2010
. // initial state
. !ls ~/Desktop/test
test2010test.txt
. // move
. !mkdir ~/Desktop/test/`i'
. !mv ~/Desktop/test/`=char(42)'`i'`=char(42)'.txt ~/Desktop/test/`i'/
. // final state
. !ls ~/Desktop/test
2010
. !ls ~/Desktop/test/2010
test2010test.txt
您可能会找到一些运气,将文件路径存储在引号中的本地文件中,然后在mv
调用中计算该本地文件路径:
. do move.do
. ls
move.do
testDir/
testFile1.txt
testFile2.md
. local cmd "./*.txt testDir/"
. !mv `cmd'
. ls
move.do
testDir/
testFile2.md
. ls testDir/
testFile1.txt
有趣的是,/*
会被解释为一条注释,如果您不通过本地代码。我相信对Stata有更好理解的人可以解释原因,但我不能
. !mv "./*.md testDir/"
mv: missing destination file operand after `./*.md testDir/'
Try `mv --help' for more information.
. ls
move.do
testDir/
testFile2.md
. ls testDir/
testFile1.txt
end of do-file
另一种方法是使用文件列表
(来自SSC)创建文件数据集,以管理和执行Stata中的所有文件维护。下面的示例假设在Stata的当前目录中有一个名为“from”的目录,其中包含一组名称为“年”的文件
. filelist, dir(from) norecur
Number of files found = 6
. list
+--------------------------------------+
| dirname filename fsize |
|--------------------------------------|
1. | from test2010test 3.txt 8,540 |
2. | from test2010test.txt 17 |
3. | from test2010test2.txt 9 |
4. | from test2011test 3.txt 5 |
5. | from test2011test.txt 3 |
|--------------------------------------|
6. | from test2011test2.txt 3 |
+--------------------------------------+
下面的代码将在当前目录和以年份命名的子目录中创建一个名为“years”的新目录。通过仅使用相对目录和Stata命令,可以使代码更具可移植性。当然,可以修改以下内容以使用shell命令来处理每个文件
* filelist if from SSC
filelist, dir(from) norecur
* extract the year from the file name
gen year = regexs(1) if regexm(filename,"([0-9][0-9][0-9][0-9])")
assert !mi(year)
* automatically discover years
levelsof year, clean
local years `r(levels)'
* create destination directories if they don't alread exist
cap mkdir "years"
foreach y of local years {
cap mkdir "years/`y'"
}
* use Stata commands to copy the files one by one.
local obs = _N
forvalues i = 1/`obs' {
local fname = filename[`i']
local dname = dirname[`i']
local from = "`dname'/`fname'"
local year = year[`i']
local to = "years/`year'/`fname'"
copy "`from'" "`to'", replace
rm "`from'"
}
运行上面的示例后,我得到
. filelist , dir(years)
Number of files found = 6
. list
+-----------------------------------------+
| dirname filename fsize |
|-----------------------------------------|
1. | years/2010 test2010test 3.txt 8,540 |
2. | years/2010 test2010test.txt 17 |
3. | years/2010 test2010test2.txt 9 |
4. | years/2011 test2011test 3.txt 5 |
5. | years/2011 test2011test.txt 3 |
|-----------------------------------------|
6. | years/2011 test2011test2.txt 3 |
+-----------------------------------------+
如果你在路径周围加上引号会怎么样?好吧,这会使星号就位,但它们不再充当通配符。这是一个交互式运行吗?我可以看到它以交互方式工作,但不是在do文件中。很好。没有在do文件中测试它。在本地内容周围加引号就可以了。我将编辑我的答案。我将如何更改它来索引子目录呢?我的问题是,我正在提取的一些ZIP会提取到包含年份的目录中。其他人直接提取到我的工作目录。我需要他们在工作目录中创建目录并将文件移到那里,或者将文件移到一个名为“years”的目录中,然后将year命名子目录中的所有文件移到这个新的子目录中。只需删除第一个文件列表上的norecur
选项,您就会得到所有文件的完整列表。然后,您可以根据文件名和/或目录路径决定对每个文件执行什么操作。谢谢Robert!这绝对是STATA中运行最优雅的解决方案。我想弄清楚的最后一件事是,如何将没有使用年限的少数文件排序为未排序的文件。我将修改其他具有年份定义的命令,看看是否能想出一些方法。