我们经常使用ctrl+c、ctrl+v来复制粘贴内容,文件、文件夹也是一样,在windows的资源管理器也可以通过用ctrl+c、ctrl+v来拷贝文件,这在dos窗口下,相当于使用copy命令。
copy命令是一个非常实用的命令工具,我们还可以使用它来合并文件,如把两个文件合并成一个,我们可以:
copy a.txt+b.txt c.txt
相当于把a.txt和b.txt合并成一个,并生成c.txt。
如果是一组文件,我们可以:
copy *.txt all.txt
相当于把所有txt文件合并成一个,并生成all.txt。
但是,所有文件是按照什么排序的呢?文件名还是文件修改时间?
不知道。
不过和dir查询的顺序是一样的。
如果想按照指定的顺序合并,如按照文件名或修改时间,查看了copy的参数没有找到,不过dir是有的:
dir /on 按文件名称顺序查看
dir /os 按文件大小顺序查看
dir /od 按文件修改时间顺序查看
dir /oe 按文件后缀名顺序查看
我们可以把dir的结果反馈给copy,我想到了批处理的for循环,因此:
for /f %%i in ('dir /b /on *.txt') do ???
for循环后面的do就是我们要做的事。
文件名已放到%%i变量中,怎么从%%i中取出来呢?
批处理里需要延时,设置
setlocal enabledelayedexpansion
才能将%%i赋给临时变量,但延时又不能复制全部文件,只能复制最后一个文件。我研究了一下,发现使用type命令可以读取文件内容,我们把文件内容重写到新文件里,因此有了如下代码:
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b /on *.txt') do (
set docname=%%i
type "!docname!" >> all.txt
)
endlocal
其中,添加delims=是解决文件名中有空格的问题。
当然,文件不能太多,不能太大,还得是文本文件。
这要在linux里,和type相当的是cat命令,不过cat命令有参数控制排序方式,默认是按文件名:
cat *.txt > all.txt
还是linux简单!