如何获取子目录的完整列表(包括子目录的子目录)?

How to acquire complete list of subdirs (including subdirs of subdirs)?

我有数千个城市文件夹(例如city1city2等,但实际上命名为NewYorkBoston等) .每个文件夹还包含两个子文件夹:landhouse

所以目录结构是这样的:

current dictionary
  ---- city1
     ----- house 
         ------ many .xlsx files
     ----- land
  ----- city2
  ----- city3
  ···
  ----- city1000

我想获取所有子目录的完整列表并进行一些操作(如 import excel)。我知道有一个宏扩展函数:local list: dir 来处理这个问题,但它似乎只能 return 子目录的 first tier,比如 city_i,而不是那些更深层次的一个。

更具体地说,如果我想在所有内部文件夹中执行操作,我需要什么样的工作流程?

我已经初步尝试编写代码来实现我的目标:

cd G:\Data_backup\Soufang_data
local folder: dir . dirs "*"
foreach i of local folder {
     local `i'_house : dir  "G:\Data_backup\Soufang_data\``i''\house" files "*.xlsx"

     local count = 1
     foreach j of local `i'_house {
        cap import excel "`j'",clear
        cap sxpose,clear
        cap drop in 1/1

        if `count'==1 {
          save `i'.dta, replace
            }
        else          {
         cap qui append using `i'
         save `i'.dta,replace
            }

       local ++count
     }
}

有问题:

``i'' 

在目录中,无论如何我都努力让它工作但没有成功。

我在这个项目上


补充说明:

正如 Nick 指出的那样,问题出在反斜杠上。然而,从这一点出发,我遇到了另一个问题。说,没有复杂的动作,我只是想测试我的循环是否有效,所以我写了下面的代码片段:

set more off
cd G:\Data_backup\Soufang_data
local folder: dir . dirs "*"
foreach i of local folder {
     di "`i'"
     local `i'_house : dir  "G:\Data_backup\Soufang_data/`i'\house" files "*.xlsx"

     foreach j of local `i'_house {
        di "`j'"
     }
}

然而,屏幕上的结果是这样的:

city1
project100
project99
······
project1

好像代码只循环了一轮,遍历了第一个城市,但是没有到达city2city3等等。我怀疑是因为我写的地方有问题,尤其是这一行,但我不确定:

foreach j of local `i'_house

虽然不是解决您实际提出的任何问题的方法,但更简单的方法可能是使用来自 SSC (ssc install filelist) 的 filelist

一个例子可能是:

. // list all files
. filelist, directory("D:\Datos\RFERRER\Desktop\example")
Number of files found = 5

. 
. // strange way of tagging directories ending in "\house"
. // change at will
. gen tag = substr(reverse(dirname),1,6) == "esuoh/"

. 
. order tag

. list

     +----------------------------------------------------------------------------------------------+
     | tag   dirname                                                     filename             fsize |
     |----------------------------------------------------------------------------------------------|
  1. |   0   D:\Datos\RFERRER\Desktop\example/proj_1                     newfile.txt              0 |
  2. |   1   D:\Datos\RFERRER\Desktop\example/proj_2/house               somefile.txt             0 |
  3. |   0   D:\Datos\RFERRER\Desktop\example/proj_3/subproj_3_2         newfile2.txt             0 |
  4. |   1   D:\Datos\RFERRER\Desktop\example/proj_3/subproj_3_2/house   anothernewfile.txt       0 |
  5. |   1   D:\Datos\RFERRER\Desktop\example/proj_3/subproj_3_2/house   someotherfile.txt        0 |
     +----------------------------------------------------------------------------------------------+

之后,使用 keepdrop,以变量 tag.

为条件

从图形上看,目录如下所示:

(我使用的是 Stata 13。查看 help string functions 了解其他标记方法。)

你修改后的问题可能会变成

local folder: dir . dirs "*"
foreach i of local folder {
     di "`i'"
     local house : dir  "G:\Data_backup\Soufang_data/`i'\house" files "*.xlsx"

     foreach j of local house {
        di "`j'"
     }
}

但显然我们看不到您的文件结构或文件名。