作者:吴玉轩 (南开大学)

Stata 连享会: 知乎 | 简书 | 码云 | CSDN

  • Stata连享会 精品专题 || 精彩推文
2019暑期“实证研究方法与经典论文”专题班-连玉君-江艇主讲

文章目录

    • 2019暑期“实证研究方法与经典论文”专题班-连玉君-江艇主讲
  • 1. mvfiles 命令简介
  • 2. mvfiles 应用实例
    • 2.1 基于 auto 数据的模拟
      • 2.1.1 excel 文件的移动
      • 2.1.2 子文件夹下 excel 文件的提取
    • 2.2 EndNote 中 PDF 文件的提取
    • 其他相关命令
      • 关于我们
      • 联系我们
      • 往期精彩推文

导言: 无论是在科研还是日常生活中,我们经常需要对同一目录下多个子文件夹下的文件进行移动操作。例如,将 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-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, clearexport excel auto`i'.xlsx,replacecd "d:\data\sub`i'"webuse auto, clearexport 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 你能提取一级子目录下的文件,无法层层递进地进一步提取孙辈、曾孙辈……文件夹中的文件。这其实可以在程序内部嵌入外部命令 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

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

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

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

其他相关命令

  • 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

关于我们

  • Stata 连享会(公众号:StataChina)】由中山大学连玉君老师团队创办,旨在定期与大家分享 Stata 应用的各种经验和技巧。
  • 公众号推文同步发布于 CSDN-Stata连享会 、简书-Stata连享会 和 知乎-连玉君Stata专栏。可以在上述网站中搜索关键词StataStata连享会后关注我们。
  • 点击推文底部【阅读原文】可以查看推文中的链接并下载相关资料。
  • Stata连享会 精品专题 || 精彩推文

联系我们

  • 欢迎赐稿: 欢迎将您的文章或笔记投稿至Stata连享会(公众号: StataChina),我们会保留您的署名;录用稿件达五篇以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。
  • 意见和资料: 欢迎您的宝贵意见,您也可以来信索取推文中提及的程序和数据。
  • 招募英才: 欢迎加入我们的团队,一起学习 Stata。合作编辑或撰写稿件五篇以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。
  • 联系邮件: StataChina@163.com

往期精彩推文

  • Stata连享会 精品专题 || 精彩推文
    推文列表")

mvfiles:一次性提取多个文件夹中的文件相关推荐

  1. 记录一下提取文件夹中所有文件名字

    配置Opencv很有用 快速提取文件夹中所有文件的名称! - 简书 (jianshu.com)

  2. matlab依次读取每个数,『matlab如何依次读取文件夹中EXCEL文件,并对每一个EXCEL特定列全部数值进行处理?』matlab调入excel文件的某一列...

    matlab导入excel表格,第一行为x,第一列为y的数据,其余为z 行的NI(r=1--0.25)比烦. filename='a.xls';%,可据你的需要更改 y=xlsread(filenam ...

  3. 如何将多个文件夹中的文件合并到一个文件夹中

    Question to say "I can!" 如何将多个文件夹中的文件合并到一个文件夹中 2011-11-27 这个算是小小的技巧吧!有两种方法,一种是传统的命令行,另一种是用 ...

  4. VMware虚拟机文件夹中各文件作用详解

    VMware虚拟机文件夹中各文件作用详解 虚拟机的文件管理由VMware Workstation来执行. 一个虚拟机一般以一系列文件的形式储存在宿主机中, 这些文件一般在由workstation为虚拟 ...

  5. Flume监听文件夹中的文件变化,并把文件下沉到hdfs

    1.采集目录到HDFS 采集需求:某服务器的某特定目录下,会不断产生新的文件,每当有新文件出现,就需要把文件采集到HDFS中去 根据需求,首先定义以下3大要素 采集源,即source--监控文件目录 ...

  6. C++读取文件夹中所有文件的路径,包含子文件夹

    C++读取文件夹中所有文件的路径,包含子文件夹 C++实现指定文件夹的路径,获取该路径下所有文件的路径,含子文件夹的文件,为了实现跨平台编译,最后会给出Window和Linux的完成程序: [1]下面 ...

  7. Java文件操作:文件夹中搜索文件

    在文件夹中搜索文件,找到的话将文件的绝对路径列表返回 /*** 递归查找文件* @param baseDirName 查找的文件夹路径* @param targetFileName 需要查找的文件名* ...

  8. 使用C语言查看一个文件夹中所有文件及目录

    1.前言 1.1声明 文章中的文字可能存在语法错语以及标点错误,请谅解: 如果在文章中发现代码错误或其它问题请告知,感谢! 2.实现方法 为了使用C语言实现查看一个文件夹中的文件数量功能,可以使用di ...

  9. java 文件递归删除文件夹_Java十行代码实现递归删除文件夹中所有文件

    递归删除文件夹中所有文件 要递归首先需要有方法.递归,即方法自己调用自己.一般在程序中很少使用,但在这个实现中,我们无法知道文件夹的深度,更无法根据深度来实现循环的嵌套. 递归两个重要条件: 终止边界 ...

最新文章

  1. SAP 远程连接出错 SAP GUI For Windows 7.40 hostname ‘NiHLGetNodeAddr‘ unknown
  2. 智能算法把奥巴马识别成白人,AI也学会歧视了?
  3. Java学习笔记(七)--格式化字符串及格式输出
  4. Zabbix4.0 for PostgreSQL (上篇):基础环境的搭建部署
  5. IOS学习:常用第三方库(GDataXMLNode:xml解析库)
  6. Opencv级联分类器实现人脸识别
  7. mysql编译安装原理_MySQL编译安装全过程
  8. 【原创】Extjs4 通用CURD方法
  9. android自动化必备之界面元素
  10. 实战篇-六十六行完成简洁的Rss输出类
  11. Unity2018引用System.Windows.Forms.dll发布报错
  12. oracle存储过程更新权限不足,oracle创建存储过程时报权限不足
  13. 计算机病毒教学评课,计算机病毒评课稿.pdf
  14. 红黑联盟现场实地渗透测试培训第一期
  15. python日期运算_Python:日期计算器
  16. 大学计算机考试知识点归纳总结,大学计算机基础重点归纳.doc
  17. 卡方分布(Chi-Squared Distribution)
  18. 以水稻为例教你如何使用BSA方法进行遗传定位(上篇)
  19. Python设置断点breakpoint(免IDE)
  20. jupyter notebook 前面书写后面内容消失

热门文章

  1. 三层交换机DHCP服务器/DHCP中继互联配置详述
  2. A02 守望先锋作品
  3. 冲压线自动化改造必学资料
  4. elementUI中DateTimePicker 日期时间选择器自定义开发,固定时间段,修改时间后取当前输入作为时间段起始
  5. 【Vue】添加新页面
  6. 2013-3-13 英语学习 be动词用法 和 复数
  7. pdf转png图片乱码问题(字体缺失,centos安装字体)
  8. 随笔(关于UE<ultraedit>的列模式使用及EXCEL使用遇到的简单问题)
  9. 第1题 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标
  10. Vue开发小实践--身份查询系统