记录一次批量处理文档的过程
要做一项工作,内容是将一个word中的图表复制到多个(接近300个)word文档的末尾,不想一个个CTRL C+CTRL V,就想到了用程序来实现
我第一个想到的使用python来实现,由于技术太渣,尝试了多次,没能写出来,只记得有一个叫做win32com的模块,专门处理文档的。这里先不说了
在查阅资料的过程中,偶然看见在linux中的cat命令似乎能做这件事,恰好我装了centos7,也在学习这Linux命令,于是转战linux。
对这个工作,我分三步进行:
1:使用cat命令将一个文档追加到另一个文档末尾
2:得到一个目录下的所有文件名(后面讲为什么)
3: 写shell脚本实现功能
一:关于cat命令
cat命令的用途是连接文件或标准输入并打印。这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用。
1.命令格式:
cat [选项] [文件]...
2.命令功能:
cat命令的功能:
1.一次显示整个文件:cat filename
2.从键盘创建一个文件:cat > filename 只能创建新文件,不能编辑已有文件.
3.将几个文件合并为一个文件:cat file1 file2 > file
4.在一个文件后追加另一个文件:cat file1 >> file2
3.命令参数:
-A, --show-all 等价于 -vET
-b, --number-nonblank 对非空输出行编号
-e 等价于 -vE
-E, --show-ends 在每行结束处显示 $
-n, --number 对输出的所有行编号,由1开始对所有输出的行数编号
-s, --squeeze-blank 有连续两行以上的空白行,就代换为一行的空白行
-t 与 -vT 等价
-T, --show-tabs 将跳格字符显示为 ^I
-u (被忽略)
-v, --show-nonprinting 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外
这里给出几个实例:
1:把 file1 的文档内容加上行号后输入 file2 这个文档里
cat -n file1 > file2
注意这里是吧file1的内容输入到file2中,file2若存在,则清空内容,里面输入file1内容,若不存在则创建file2,输入file1内容
2:把 file1 和 file2 的文档内容加上行号(空白行不加)之后将内容追加到 file3 文档里:
cat -b file1 file2 >>file3
该操作不会改变file3中原有的内容,把file1和file2的内容追加到file3的末尾
3:创建一个名为a.txt的文件
cat >a.txt <<EOF
>EOF
输入第一行后,输入EOF,回车,就可以生成一个 a.txt 文件。其中EOF是告诉 bash 哪个符号代表文件结束。当然你也可以使用自己习惯的符号。
4: 利用cat清空文件内容
如果 b.txt 文件有很多内容,而你想要清空的话,同样可以使用上面提到的命令形式:
cat >b.txt << EOF >EOF
5: cat命令可以直接向文件中写入东西,并覆盖掉原本的东西
cat >c.txt <<EOF >2222 >3333 >EOF
利用cat命令处理的时候,尽量带上文件的格式,例如1.txt,1.doc
要是第一步,文件追加需要用到这个命令
cat file1 >> file2
二:获取一个目录下的文件名
获取目录下的文件名可以直接使用 ls 命令,但只是将名字打印出来,不能获得这个名字,也就是说如果想要在后面使用cat命令对这些文件进行处理的话,需要用一个变量来接收这些文件名,再对这个变量进行cat操作
下面介绍两种常用的方法来进行相关操作
1:使用${ }
①${var##*/}
该命令的作用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边的内容。
使用例子及结果如下:
~$ var = /dir1/dir2/file.txt ~$ echo ${var##*/} file.txt
从运行结果可以看到,使用该命令,可以提取出我们需要的文件名file.txt。
若使用时在shell程序文件中,可以使用变量来保存这个结果,再加以利用,如file = ${var##*/}
②${var##*.}
该命令的作用是去掉变量var从左边算起的最后一个'.'字符及其左边的内容,返回从左边算起的最后一个'.'(不含该字符)的右边的内容。
使用例子及结果如下:
~$ var = /dir1/dir2/file.txt ~$ echo ${var##*.} txt
从运行结果可以看到,使用该命令,可以提取出我们需要的文件后缀。
如果文件的后缀不仅有一个,例如,file.tar.gz,命令${var##*.}仅能提取最后一个后缀,而我想提取tar.gz时该怎么办?那么就要用下面所说的${var#*.}命令了。
③${var#*.}
该命令的作用是去掉变量var从左边算起的第一个'.'字符及其左边的内容,返回从左边算起第一个'.'(不含该字符)的右边部分的内容。
使用例子及结果如下:
~$ var = /dir1/dir2/file.tar.gz ~$ echo ${var#*.} tar.gz
从运行结果可以看到,使用该命令,可以提取出文件的多个后缀.
④${var%/*}
该命令的使用是去掉变量var从右边算起的第一个'/'字符及其右边的内容,返回从右边算起的第一个'/'(不含该字符)的左边的内容。
使用例子及结果如下:
~$ var = /dir1/dir2/file.txt ~$ echo ${var%/*} /dir1/dir2
使用该命令,可以提取出我们需要的文件所在的目录.
⑤${var%%.*}
该命令的使用是去掉变量var从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容。
使用例子及结果如下:
~$ var = /dir1/dir2/file.txt ~$ echo ${var%%.*} /dir/dir/file
当我们需要建立一个与文件名相同名字(没有后缀)的目录与对应的文件相对应时,就可以使用该命令来进行操作。例如,解压文件的情况就与此类似,我们压缩文件file.zip时,会在与file.zip同级目录下建立一个名为file的目录。
⑥总结${ }
${}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的'/'或'.'。也就是说,上面的使用方法只是它使用的一个特例。
看到上面的这些命令,可能会让人感到非常难以理解和记忆,其实不然,它们都是有规律的。
#:表示从左边算起第一个
%:表示从右边算起第一个
##:表示从左边算起最后一个
%%:表示从右边算起最后一个
换句话来说,#总是表示左边算起,%总是表示右边算起。
*:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容;对于%和%%的情况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容。这里的'*'的位置不能互换,即不能把*号放在#或##的右边,反之亦然。
例如:${var%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。
看到这里,就可以知道,其实该命令的用途非常广泛,上面只是指针文件名和目录名的命名特性来进行提取的一些特例而已。
2:basename和dirname
${}并不是专门为提取文件名和目录名设计的命令,那么basename和dirname命令就是专门为做这一件事而已准备的了。
①basename
该命令的作用是从路径中提取出文件名,使用方法为:
basename NAME [SUFFIX]
1)从路径中提出出文件名(带后缀)
例子如下:
~$ var = /dir1/dir2/file.txt ~$ echo $(basename $var) file.txt
2)从上面命令的用法中可以看到,后缀(SUFFIX)是一个可选项。所以,若只想提取出文件名file,而不带有后缀,还可以在变量的后面加上后缀名
例子如下:
~$ var = /dir1/dir2/file.txt ~$ echo $(basename $var.txt) file
②dirname
该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME
使用例子如下:
~$ var = /dir1/dir2/file.txt ~$ dirname $var /dir1/dir2
这样就提取出了file.txt文件所在的目录。
注:该命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录,如下:
~$ var = /dir1/dir2/ ~$ dirname $var /dir1
它提取出了目录dir2所在的目录dir1
三:shell脚本的实现
为方便进行操作,我把shell脚本与待处理文件放在了同一文件夹下
vi Additional_document.sh
将下列代码输入:
#这里是待处理文件的位置 Folder_A="/home/liuyaanng/liu" for file_a in ${Folder_A}/* do temp_file=`basename $file_a` cat a.txt >> $temp_file echo 'success' done
保存退出后,要赋予shell脚本可执行权限,由于脚本与待处理文件在一个文件夹下,所以该脚本同样会被cat命令作用,为避免有东西再写入该脚本,要修改访问权限为只读
chmod r+x Additional_document.sh
执行该程序即可
./Additional_document.sh
有几个需要注意的问题:
1:该脚本仅支持纯文本的追加,不支持诸如图片,表格等
2:若处理windows系统下的word文件,打开文件是乱码,原因可能是你的linu系统下未安装对应的字体(并非未安装中文,是诸如宋体,楷体)
3:txt格式与doc格式也可追加,但为避免出现格式问题,可提前进行转格式操作,再进行追加
转格式为:
unoconv -f doc a.txt
unoconv存在于很多发行版的软件仓库中,也可通过下载安装。
以上,为在linux下的完整操作
在我查阅大量资料的时候,发现两款在Windows下专门做批量处理文档的神器
在下载的时候,某度的搜索结果捆绑了太多软件,一不小心来了个全家桶,所以我在这分享一下安全绿色无捆绑的资源(排除打广告嫌疑,只是推荐,逃ε=ε=ε=┏(゜ロ゜;)┛)
一:word文档批处理大师 Batchword(付费版本,土豪推荐)
链接: 密码:j7w1
这个我找了很久,找不到万能的注册机,破解版的也尝试了,暂时没有找到能用的,有资源的请默默留下链接(^人^)
word文档批量处理大师基本功能
1、批量运行word宏代码:
2、批量插入版权/随机文字、随机版权图片:
3、批量添加文字超链接、替换文档内容
4、批量格式设置:
5、页面设置、属性设置
6、替换/设置图片、超链接
7、word转图片或PDF
8、设置/清除文字页眉、图片页眉
9、设置/清除文字页脚、图片页脚
10、设置/清除文字水印、图片水印
11、批量打印
12、插入/合并文档
13、转换类型(可转换为doc、rtf、txt、xml、htm、html、mht、mhtml、dot、docx、dotx中的任一格式)
14、繁简转换
15、设置、修改密码
二:BatchDoc(功能较BatchWord少,也是需要注册)
链接:; 密码:cbfo
这个在万能的吾爱破解坛友的帮助下还是有道道哈哈哈,打开软件后输入传送门:HJG4567-AQsmVAo-8
下一篇: ln 硬链接介绍