mvfiles:一次性提取多个文件夹中的文件

发布时间:2020-07-04 阅读 160

Stata 连享会   主页 || 视频 || 推文

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

课程详情 https://gitee.com/arlionn/Course   |   lianxh.cn

课程主页 https://gitee.com/arlionn/Course

作者:吴玉轩 (南开大学)
Email:peteral@yeah.net


目录


导言: 无论是在科研还是日常生活中,我们经常需要对同一目录下多个子文件夹下的文件进行移动操作。例如,将 EndNote 生成的多个子文件夹下的 PDF 文档移动到一个文件夹;对从国泰安数据库下载的多个子文件夹中的文件进行合并;将 百度音乐千千静听 的软件自动产生的分散于多个文件夹中的音频文件合并到一个文件夹中,等等。

本文介绍的 mvfiles 命令可以从多个文件夹提取文件,是完成上述任务的利器。

1. mvfiles 命令简介

ssc install mvfiles, replace 

安装完成后使用 help mvfiles 命令可以查看其帮助文件。mvfiles 的语法结构如下:

mvfiles [, infolder(string) outfolder(string) match(string)
           subs(string) makedirs erase oldstx]

各个选项含义如下:

  • infolder() 设定待搜寻的文件所在的文件路径
  • outfolder() 设定目标文件路径
  • match() 设定文件匹配准则
  • subs() 确定匹配准则是否应用于子文件夹
  • makedirs 如果目标文件夹不存在,则自动生成
  • erase 旧文件被移动后自动删除
  • oldstx 兼容 Stata 9.0 以下版本,较少使用

2. mvfiles 应用实例

下面将通过几个实例展示 mvfiles 的具体用法。

2.1 基于 auto 数据的模拟

本小节将利用 Stata 自带的 auto.dta 数据生成 excel 文件及相应的文件夹,然后利用 mvfiles 移动各个子文件夹中的 excel 文件。

2.1.1 excel 文件的移动

  • 生成 excel 文件
cap mkdir "d:\data" //新建工作文件夹data
cd d:\data //将d:\data作为当前工作路径
webuse auto, clear //读入auto数据
// 利用循环,在 data 文件夹下生成 10个excel 文件,分别命名为 auto1-auto5, sub1-sub5
forvalues i=1(1)5{
export excel auto`i'.xlsx,replace
export excel sub`i'.xlsx,replace
}

运行上述代码,得到下图所示的 10 个 excel 文件:

excel文件
excel文件

如果想将 d:\data 文件夹下的 sub1-sub5 等5个 excel 文件移动至 d:\data\move_sub 文件夹下,可以采用如下命令:

mvfiles , infolder(".") outfolder(".\move_sub")  ///
          match("sub*") makedirs erase 

选项释义:

  • match 选项表明是通过开头的 sub 字符作为匹配标准
  • makedirs 用来生成 move_sub 子文件夹
  • erase 选项将 [d:\data] 下的原始文件删除,相当于执行了剪切的操作,

如下代码则将 [d:\data] 文件夹下的所有 excel 文件移动至 move_all 子文件夹下。:

mvfiles , infolder(".") outfolder(".\move_all") match("*") makedirs erase

2.1.2 子文件夹下 excel 文件的提取

本小节首先在 [d:\data] 下生成若干子文件夹及 excel 文件,然后展示 excel 文件在子文件夹中的提取过程。

  • d:\data\ 下生成 10 个子文件夹,分别命名为 auto1-auto5sub1-sub5,并在每个子文件夹下生成相应的 excel 文件。
  • 代码如下:
forvalues i=1(1)5{
    cap mkdir "d:\data\auto`i'"
    cap mkdir "d:\data\sub`i'"
    cd "d:\data\auto`i'"
    webuse auto, clear
    export excel auto`i'.xlsx,replace
    cd "d:\data\sub`i'"
    webuse auto, clear
    export excel sub`i'.xlsx,replace
}

这样便生成了10个子文件夹,并在每个子文件夹下生成了1个 excel 文件,文件名称与文件夹名称一致,结果如下图:

子文件夹
子文件夹

现在,只需要如下简单的命令就可以将以 auto 开头的子文件夹下的 excel 文件统一移至 move_data文件夹下。

cd d:\data
mvfiles , infolder(".") outfolder(".\move_data") match("auto*") subs("auto*") makedirs
// subs选项用来选择匹配的子文件夹,
// 此处选择的是子文件夹名称为 auto 的文件夹中的excel文件

下图展示了移动后的结果:

excel移动效果图
excel移动效果图

2.2 EndNote 中 PDF 文件的提取

应用场景: 我的同学向我索要一些有关 Bootstrap 的经典文献,我在我的 EndNote 中找到了 20 多篇,想把对应的 PDF 文件发给她。以往的做法是一篇一篇 另存 到一个文件夹中,很繁琐。

现在想到了一个好办法,就是先选中这些文献,右击,把这些文献存入一个新的 EndNote 文献库【BS-EndNote Library】,而相应的 PDF 文件就被存放在该文件夹下的 【PDF】自文件夹。

可是,问题又来了,20 篇 PDF 文件被分散存储在 20 个不同的文件夹中,想把它们一个一个提取出来也挺麻烦。

上述实操过程见下图:

从 EndNote 中导出的 PDF 文件
从 EndNote 中导出的 PDF 文件

此时,若用 mvfiles 命令便非常简单。

Stata 范例 1: mvfiles 的基本用法

  • 做法1: 使用默认选项
* 改变工作路径至存储 PDF 文件的位置
  . cd "D:\Bootstrap\BS-EndNote Library.Data\PDF"
* 提取当前工作路径下以及子文件夹中的所有 PDF 文件 (`*.pdf`)
  .  mvfiles, subs("*") match("*.pdf")

注意,本例中的两个选项 subs("*")match("*.pdf") 都必须填入才能实现我们的目的。

  • subs("*") 表明我们不但要提取当前路径下的文件,还要提取其子文件夹中的文件;

  • match("*.pdf") 则指定了需要提取的文件必须以 .pdf 结尾,即 PDF 文件。*.pdf 的准确含义是:以任何字符开头 (通配符 * 的作用),以 .pdf 结尾的文件。

  • 被提取出的所有 PDF 文件会被自动存放于一个名为 mvfiles 的文件夹中 (该文件夹会被自动生成,存放于当前工作路径下)。

  • 做法2: 设置完整的输入\输出路径 我们也可以在 mvfiles 命令中附加 infolder() 和\或 outfolder() 选项,以便将上述命令合并为一条命令,并自行制定存放 PDF 文件的文件夹名称。这在程序定义中非常有用:

* 改变工作路径至存储 PDF 文件的位置
  global path "D:\Bootstrap\BS-EndNote Library.Data\PDF"
* 在所有子文件夹下,按照关键字 JIE 匹配 PDF 文件,并进行移动操作
  mvfiles , infolder("$path") outfolder("$path\PDF_ALL") makedirs ///
            subs("*") match("*.pdf")  

输出效果如下:

mvfiles 自动提取的 PDF 文件)

  • mvfiles 的几个 bugs
    • 在上例中,虽然我们指定了用于存放输出 PDF 文件的文件夹 PDF_ALL,但 mvfiles 仍然会在该文件夹下自动生成一个名为 mvfiles 的子文件夹,里面存放的 PDF 文件与 PDF_ALL 中完全相同;
    • mvfiles 你能提取一级子目录下的文件,无法层层递进地进一步提取孙辈、曾孙辈……文件夹中的文件。这其实可以在程序内部嵌入外部命令 lmsdirbrcd 以便能够遍历所有子孙文件夹。程序的修改工作留给读者。

Stata 范例 2: 提取包含特定关键词的 PDF 文件

在使用 EndNote 软件管理文献的过程中,在电脑硬盘下会形成如下图所示的文件夹布局形式 (限于篇幅,只截取了部分内容):

上面的每个子文件夹中保存着相应的文献(PDF格式),现在想获取所有子文件夹下 PDF 文件名称中包含 JIE 字符的文件,并移动至 literature_JIE 文件夹下(设想一下,某一天,心血来潮,想看看自己收藏了多少 JIE 论文;或者是想把这些文献发给一个不适用 EndNote 的 Coauthor),代码可以写为:

* 更换工作路径,注意:***位置替换为自己的文件路径
  cd "d:\***\My  Library-literature.Data\PDF"
* 在所有子文件夹下,按照关键字 JIE 匹配 PDF 文件,并进行移动操作
  mvfiles , infolder(".") outfolder(".\literature_JIE")  ///
            match("*JIE*") subs("*") makedirs

最终效果如下图(限于篇幅,仅展示了部分内容):

mvfiles:包含 JIE 关键词的文献搜寻
mvfiles:包含 JIE 关键词的文献搜寻

当然,大家也可以根据作者或者年份等关键字提取 PDF 文献,对于日常生活中的视频或音频类文件也可以采用类似的处理。

以上就是 mvfiles 的相关内容,掌握了这一命令可以很方便的完成文件的提取与转移操作。

3. 其他相关命令

  • help msdirb //列示指定文件夹中的文件名,存储于 .dta 文件中
  • help lmsdirb //列示指定文件夹中的文件名,存储于暂元中
  • help rcd //遍历文件夹及所有子文件夹,文件名存储于返回值中,便于后续循环调用。rcd.ado 是个自循环程序,牛!
  • help dirtools //一系列管理文件的快捷命令
  • help renfiles // renaming set of matched files
  • help rmfiles // removing set of matched files

相关课程

连享会-直播课 上线了!
http://lianxh.duanshu.com

免费公开课:


课程一览

支持回看,所有课程可以随时购买观看。

专题 嘉宾 直播/回看视频
最新专题 DSGE, 因果推断, 空间计量等
Stata数据清洗 游万海 直播, 2 小时,已上线
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]

Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
  • 连享会-主页知乎专栏,300+ 推文,实证分析不再抓狂。
  • 公众号推文分类: 计量专题 | 分类推文 | 资源工具。推文分成 内生性 | 空间计量 | 时序面板 | 结果输出 | 交乘调节 五类,主流方法介绍一目了然:DID, RDD, IV, GMM, FE, Probit 等。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会主页  lianxh.cn
连享会主页 lianxh.cn

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会学习群-常见问题解答汇总:
https://gitee.com/arlionn/WD

热门资讯

08/29 专题课程 2429
03/12 计量专题 5153
01/01 工具软件 5523
09/22 专题课程 554
09/21 专题课程 1953
09/21 专题课程 78
09/20 Probit-Logit 57