mvfiles:一次性提取多个文件夹中的文件
作者:吴玉轩 (南开大学)
Stata 连享会: 知乎 | 简书 | 码云 | CSDN
导言:无论是在科研还是日常生活中,我们经常需要对同一目录下多个子文件夹下的文件进行移动操作。例如,将 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 文件:
如果想将 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-auto5 及 sub1-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文件
下图展示了移动后的结果:
2.2 EndNote 中 PDF 文件的提取
应用场景: 我的同学向我索要一些有关 Bootstrap 的经典文献,我在我的 EndNote 中找到了 20 多篇,想把对应的 PDF 文件发给她。以往的做法是一篇一篇 另存 到一个文件夹中,很繁琐。
现在想到了一个好办法,就是先选中这些文献,右击,把这些文献存入一个新的 EndNote 文献库【BS-EndNote Library】,而相应的 PDF 文件就被存放在该文件夹下的 【PDF】自文件夹。
可是,问题又来了,20 篇 PDF 文件被分散存储在 20 个不同的文件夹中,想把它们一个一个提取出来也挺麻烦。
上述实操过程见下图:
此时,若用 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 的几个 bugs
在上例中,虽然我们指定了用于存放输出 PDF 文件的文件夹 PDF_ALL,但
mvfiles
仍然会在该文件夹下自动生成一个名为 mvfiles 的子文件夹,里面存放的 PDF 文件与 PDF_ALL 中完全相同;mvfiles
你能提取一级子目录下的文件,无法层层递进地进一步提取孙辈、曾孙辈……文件夹中的文件。这其实可以在程序内部嵌入外部命令lmsdirb
或rcd
以便能够遍历所有子孙文件夹。程序的修改工作留给读者。
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
最终效果如下图(限于篇幅,仅展示了部分内容):
当然,大家也可以根据作者
或者年份
等关键字提取 PDF 文献,对于日常生活中的视频或音频类文件也可以采用类似的处理。
以上就是 mvfiles
的相关内容,掌握了这一命令可以很方便的完成文件的提取与转移操作。
其他相关命令
help msdirb
//列示指定文件夹中的文件名,存储于 .dta 文件中help lmsdirb
//列示指定文件夹中的文件名,存储于暂元中help rcd
//遍历文件夹及所有子文件夹,文件名存储于返回值中,便于后续循环调用。rcd.ado 是个自循环程序,牛!help dirtools
//一系列管理文件的快捷命令help renfiles
// renaming set of matched fileshelp rmfiles
// removing set of matched files
关于我们
【Stata 连享会(公众号:StataChina)】由中山大学连玉君老师团队创办,旨在定期与大家分享 Stata 应用的各种经验和技巧。
公众号推文同步发布于 CSDN-Stata连享会 、简书-Stata连享会 和 知乎-连玉君Stata专栏。可以在上述网站中搜索关键词
Stata
或Stata连享会
后关注我们。点击推文底部【阅读原文】可以查看推文中的链接并下载相关资料。
Stata连享会 精彩推文1 || 精彩推文2
联系我们
欢迎赐稿: 欢迎将您的文章或笔记投稿至
Stata连享会(公众号: StataChina)
,我们会保留您的署名;录用稿件达五篇
以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。意见和资料: 欢迎您的宝贵意见,您也可以来信索取推文中提及的程序和数据。
招募英才: 欢迎加入我们的团队,一起学习 Stata。合作编辑或撰写稿件五篇以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。
联系邮件: StataChina@163.com
往期精彩推文