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

论坛 期权论坛 期权     
Stata连享会   2019-5-15 13:08   6513   0
[h2][/url][/h2]
作者:吴玉轩 (南开大学)
Stata 连享会: 知乎 | 简书 | 码云 | CSDN
[url=http://mp.weixin.qq.com/s?__biz=MzAwMzk4ODUzOQ==&mid=2247485104&idx=1&sn=8c47b6a91d36cd81fc57f9b9cdd550b6&chksm=9b338be4ac4402f2e2b7358a827202258691bdd76d656d07eca27ce50905f1d47dd6042e0071&scene=21#wechat_redirect]python 爬虫与文本分析专题-现场班

导言:无论是在科研还是日常生活中,我们经常需要对同一目录下多个子文件夹下的文件进行移动操作。例如,将 EndNote 生成的多个子文件夹下的 PDF 文档移动到一个文件夹;对从国泰安数据库下载的多个子文件夹中的文件进行合并;将 百度音乐,千千静听 的软件自动产生的分散于多个文件夹中的音频文件合并到一个文件夹中,等等。
本文介绍的
  1. mvfiles
复制代码
命令可以从多个文件夹提取文件,是完成上述任务的利器。
[h1]1. mvfiles 命令简介[/h1]
    1. ssc install mvfiles, replace
    复制代码
安装完成后使用
  1. help mvfiles
复制代码
命令可以查看其帮助文件。
  1. mvfiles
复制代码
的语法结构如下:
    1. mvfiles [, infolder(string) outfolder(string) match(string)
    复制代码
    1.            subs(string) makedirs erase oldstx]
    复制代码
各个选项含义如下:
    1. infolder()
    复制代码
      设定待搜寻的文件所在的文件路径
    1. outfolder()
    复制代码
    设定目标文件路径
    1. match()
    复制代码
          设定文件匹配准则
    1. subs()
    复制代码
          确定匹配准则是否应用于子文件夹
    1. makedirs
    复制代码
      如果目标文件夹不存在,则自动生成
    1. erase
    复制代码
          旧文件被移动后自动删除
    1. oldstx
    复制代码
         兼容 Stata 9.0 以下版本,较少使用
[h1]2. mvfiles 应用实例[/h1]下面将通过几个实例展示
  1. mvfiles
复制代码
的具体用法。
[h2]2.1 基于 auto 数据的模拟[/h2]本小节将利用 Stata 自带的 auto.dta 数据生成 excel 文件及相应的文件夹,然后利用
  1. mvfiles
复制代码
移动各个子文件夹中的 excel 文件。
[h3]2.1.1   excel 文件的移动[/h3]
  • 生成 excel 文件
    1. cap mkdir "d:\data" //新建工作文件夹data
    复制代码
    1. cd d:\data //将d:\data作为当前工作路径
    复制代码
    1. webuse auto, clear //读入auto数据
    复制代码
    1. // 利用循环,在 data 文件夹下生成 10个excel 文件,分别命名为 auto1-auto5, sub1-sub5
    复制代码
    1. forvalues i=1(1)5{
    复制代码
    1. export excel auto`i'.xlsx,replace
    复制代码
    1. export excel sub`i'.xlsx,replace
    复制代码
    1. }
    复制代码
运行上述代码,得到下图所示的 10 个 excel 文件:

excel文件如果想将
  1. d:\data
复制代码
文件夹下的 sub1-sub5 等5个 excel 文件移动至
  1. d:\data\move_sub
复制代码
文件夹下,可以采用如下命令:
    1. mvfiles , infolder(".") outfolder(".\move_sub")  ///
    复制代码
    1.           match("sub*") makedirs erase
    复制代码
选项释义:
    1. match
    复制代码
    选项表明是通过开头的 sub 字符作为匹配标准
    1. makedirs
    复制代码
    用来生成 move_sub 子文件夹
    1. erase
    复制代码
    选项将 [d:\data] 下的原始文件删除,相当于执行了剪切的操作,
如下代码则将 [d:\data] 文件夹下的所有 excel 文件移动至 move_all 子文件夹下。
    1. mvfiles , infolder(".") outfolder(".\move_all") match("*") makedirs erase
    复制代码
[h3]2.1.2 子文件夹下 excel 文件的提取[/h3]本小节首先在 [d:\data] 下生成若干子文件夹及 excel 文件,然后展示 excel 文件在子文件夹中的提取过程。
  1. d:\data\
复制代码
下生成 10 个子文件夹,分别命名为 auto1-auto5 及 sub1-sub5,并在每个子文件夹下生成相应的 excel 文件。代码如下:
    1. forvalues i=1(1)5{
    复制代码
    1.     cap mkdir "d:\data\auto`i'"
    复制代码
    1.     cap mkdir "d:\data\sub`i'"
    复制代码
    1.     cd "d:\data\auto`i'"
    复制代码
    1.     webuse auto, clear
    复制代码
    1.     export excel auto`i'.xlsx,replace
    复制代码
    1.     cd "d:\data\sub`i'"
    复制代码
    1.     webuse auto, clear
    复制代码
    1.     export excel sub`i'.xlsx,replace
    复制代码
    1. }
    复制代码
这样便生成了10个子文件夹,并在每个子文件夹下生成了1个 excel 文件,文件名称与文件夹名称一致,结果如下图:

子文件夹现在,只需要如下简单的命令就可以将以
  1. auto
复制代码
开头的子文件夹下的 excel 文件统一移至
  1. move_data
复制代码
文件夹下。
    1. cd d:\data
    复制代码
    1. mvfiles , infolder(".") outfolder(".\move_data") match("auto*") subs("auto*") makedirs
    复制代码
    1. // subs选项用来选择匹配的子文件夹,
    复制代码
    1. // 此处选择的是子文件夹名称为 auto 的文件夹中的excel文件
    复制代码
下图展示了移动后的结果:

excel移动效果图[h2]2.2 EndNote 中 PDF 文件的提取[/h2]
应用场景: 我的同学向我索要一些有关 Bootstrap 的经典文献,我在我的 EndNote 中找到了 20 多篇,想把对应的 PDF 文件发给她。以往的做法是一篇一篇 另存 到一个文件夹中,很繁琐。
现在想到了一个好办法,就是先选中这些文献,右击,把这些文献存入一个新的 EndNote 文献库【BS-EndNote Library】,而相应的 PDF 文件就被存放在该文件夹下的 【PDF】自文件夹。
可是,问题又来了,20 篇 PDF 文件被分散存储在 20 个不同的文件夹中,想把它们一个一个提取出来也挺麻烦。
上述实操过程见下图:

从 EndNote 中导出的 PDF 文件此时,若用
  1. mvfiles
复制代码
命令便非常简单。
Stata 范例 1: mvfiles 的基本用法
  • 做法1: 使用默认选项
    1. * 改变工作路径至存储 PDF 文件的位置
    复制代码
    1.   . cd "D:\Bootstrap\BS-EndNote Library.Data\PDF"
    复制代码
    1. * 提取当前工作路径下以及子文件夹中的所有 PDF 文件 (`*.pdf`)
    复制代码
    1.   .  mvfiles, subs("*") match("*.pdf")
    复制代码
注意,本例中的两个选项
  1. subs("*")
复制代码
  1. match("*.pdf")
复制代码
都必须填入才能实现我们的目的。
    1. subs("*")
    复制代码
    表明我们不但要提取当前路径下的文件,还要提取其子文件夹中的文件;
    1. match("[i].pdf")` 则指定了需要提取的文件必须以 `.pdf` 结尾,即 PDF 文件。`[/i].pdf
    复制代码
    的准确含义是:以任何字符开头 (通配符
    1. *
    复制代码
    的作用),以 `.pdf` 结尾的文件。
  • 被提取出的所有 PDF 文件会被自动存放于一个名为 mvfiles 的文件夹中 (该文件夹会被自动生成,存放于当前工作路径下)。
  • 做法2: 设置完整的输入\输出路径我们也可以在
    1. mvfiles
    复制代码
    命令中附加
    1. infolder()
    复制代码
    和\或  
    1. outfolder()
    复制代码
    选项,以便将上述命令合并为一条命令,并自行制定存放 PDF 文件的文件夹名称。这在程序定义中非常有用:
    1. * 改变工作路径至存储 PDF 文件的位置
    复制代码
    1.   global path "D:\Bootstrap\BS-EndNote Library.Data\PDF"
    复制代码
    1. * 在所有子文件夹下,按照关键字 JIE 匹配 PDF 文件,并进行移动操作
    复制代码
    1.   mvfiles , infolder("$path") outfolder("$path\PDF_ALL") makedirs ///
    复制代码
    1.             subs("*") match("*.pdf")  
    复制代码
输出效果如下:

mvfiles 自动提取的 PDF 文件
  • mvfiles 的几个 bugs
    • 在上例中,虽然我们指定了用于存放输出 PDF 文件的文件夹 PDF_ALL,但
      1. mvfiles
      复制代码
      仍然会在该文件夹下自动生成一个名为 mvfiles 的子文件夹,里面存放的 PDF 文件与 PDF_ALL 中完全相同;
      1. mvfiles
      复制代码
      你能提取一级子目录下的文件,无法层层递进地进一步提取孙辈、曾孙辈……文件夹中的文件。这其实可以在程序内部嵌入外部命令
      1. lmsdirb
      复制代码
      1. rcd
      复制代码
      以便能够遍历所有子孙文件夹。程序的修改工作留给读者。
Stata 范例 2: 提取包含特定关键词的 PDF 文件
在使用 EndNote 软件管理文献的过程中,在电脑硬盘下会形成如下图所示的文件夹布局形式 (限于篇幅,只截取了部分内容):

image上面的每个子文件夹中保存着相应的文献(PDF格式),现在想获取所有子文件夹下 PDF 文件名称中包含 JIE 字符的文件,并移动至 literature_JIE 文件夹下(设想一下,某一天,心血来潮,想看看自己收藏了多少 JIE 论文;或者是想把这些文献发给一个不适用 EndNote 的 Coauthor),代码可以写为:
    1. * 更换工作路径,注意:***位置替换为自己的文件路径
    复制代码
    1.   cd "d:\***\My  Library-literature.Data\PDF"
    复制代码
    1. * 在所有子文件夹下,按照关键字 JIE 匹配 PDF 文件,并进行移动操作
    复制代码
    1.   mvfiles , infolder(".") outfolder(".\literature_JIE")  ///
    复制代码
    1.             match("*JIE*") subs("*") makedirs
    复制代码
最终效果如下图(限于篇幅,仅展示了部分内容):

mvfiles:包含 JIE 关键词的文献搜寻当然,大家也可以根据
  1. 作者
复制代码
或者
  1. 年份
复制代码
等关键字提取 PDF 文献,对于日常生活中的视频或音频类文件也可以采用类似的处理。
以上就是
  1. mvfiles
复制代码
的相关内容,掌握了这一命令可以很方便的完成文件的提取与转移操作。
[h2]其他相关命令[/h2]
    1. help msdirb
    复制代码
    //列示指定文件夹中的文件名,存储于 .dta 文件中
    1. help lmsdirb
    复制代码
    //列示指定文件夹中的文件名,存储于暂元中
    1. help rcd
    复制代码
    //遍历文件夹及所有子文件夹,文件名存储于返回值中,便于后续循环调用。rcd.ado 是个自循环程序,牛!
    1. help dirtools
    复制代码
    //一系列管理文件的快捷命令
    1. help renfiles
    复制代码
    // renaming set of matched files
    1. help rmfiles
    复制代码
    // removing set of matched files
[h3]关于我们[/h3]
  • 【Stata 连享会(公众号:StataChina)】由中山大学连玉君老师团队创办,旨在定期与大家分享 Stata 应用的各种经验和技巧。
  • 公众号推文同步发布于 CSDN-Stata连享会 、简书-Stata连享会 和 知乎-连玉君Stata专栏。可以在上述网站中搜索关键词
    1. Stata
    复制代码
    1. Stata连享会
    复制代码
    后关注我们。
  • 点击推文底部【阅读原文】可以查看推文中的链接并下载相关资料。
  • Stata连享会 精彩推文1   || 精彩推文2
[h3]联系我们[/h3]
  • 欢迎赐稿:  欢迎将您的文章或笔记投稿至
    1. Stata连享会(公众号: StataChina)
    复制代码
    ,我们会保留您的署名;录用稿件达
    1. 五篇
    复制代码
    以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。
  • 意见和资料:  欢迎您的宝贵意见,您也可以来信索取推文中提及的程序和数据。
  • 招募英才:  欢迎加入我们的团队,一起学习 Stata。合作编辑或撰写稿件五篇以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。
  • 联系邮件:  StataChina@163.com
[h3]往期精彩推文[/h3]


欢迎加入Stata连享会(公众号: StataChina)[h2]一起学空间计量……[/h2][url=http://mp.weixin.qq.com/s?__biz=MzAwMzk4ODUzOQ==&mid=2247485064&idx=1&sn=58e05c5ef029356ddfe71cb6defefd4b&chksm=9b338bdcac4402caebd7ff2e33af05ad0133351e277040f5d365a3da2fdbf2d6036fe75f9789&scene=21#wechat_redirect][/url]
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:190
帖子:39
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP