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中运行最优雅的解决方案。我想弄清楚的最后一件事是,如何将没有使用年限的少数文件排序为未排序的文件。我将修改其他具有年份定义的命令,看看是否能想出一些方法。