基于文件列表批量拷贝文件
来源:互联网 发布:易语言英语考试软件 编辑:程序博客网 时间:2024/06/05 08:32
最近因为工作的需要以及老大的要求,需要将每次提交到SVN的文件拷贝到另外一台电脑上,本来在那台电脑上搭建SVN就可以很好的解决这个问题。但是老大不同意,只能自己将修改的文件一个个拷贝过去。搞了几天感觉耗费了不少时间,而且把时间花在这个方面真的很不值得。老大也叫我想办法开发个工具来提高工作效率,学习的最终目的在于实践。于是用所学的知识开发了一个工具。有Shell脚本和C++两种方式实现的。
假设我们获取了文件列表并将其保存在一个txt文件中。
<span style="font-size:18px;">/usr/test/home/Richard/testmate-screensavermate-screensaver-commandmate-screensaver-preferencesmate-screenshotmate-search-toolmate-sessionmate-session-propertiesmate-session-savemate-settings-daemonmate-system-logmate-system-monitor</span>
/usr/test是源目录,/home/Richard/test是目标目录,下面的就是待拷贝的文件。
接下来我们要做的工作就是将源目录中的指定文件拷贝到目标目录中。
学过Linux的同学都知道可以使用mkdir 来创建目录,使用cp命令来拷贝文件。下面就贴出Shell脚本
<span style="font-size:18px;">#!/bin/bashFILENAME="$1"count=0SrcBaseDir=""#源目录DstBaseDir=""#目标目录PureFileName=""#文件名,对应于文件列表中的每一行SrcFullFileName=""#源文件全路径DstFullFileName="" #目标文件全路径#拷贝文件function CopyFiles(){ while read LINEdo{count=$[ $count + 1 ]if [ $count -eq 1 ] thenSrcBaseDir=$LINEif [ ! \( -e $SrcBaseDir \) ]thenbreakfiif test ${SrcBaseDir#${SrcBaseDir%?}} != "/"thenSrcBaseDir=${SrcBaseDir}"/"fielif [ $count -eq 2 ]then#判断目录是否存在,不存在则创建,并在目录后面加/DstBaseDir=$LINEif [ ! \( -e $DstBaseDir \) ]thenmkdir -p $DstBaseDirfiif test ${DstBaseDir#${DstBaseDir%?}} != "/"#判断结尾是否有/thenDstBaseDir=${DstBaseDir}"/"fielsePureFileName=$LINE#文件名if test ${PureFileName:1:1} = "/"thenPureFileName=${PureFileName#*/}#去掉开头的/fiSrcFullFileName=${SrcBaseDir}${PureFileName}#源文件完整路径名DstFullFileName=${DstBaseDir}${PureFileName}#目标文件完整路径名echo $SrcFullFileNameecho $DstFullFileName#判断源文件是否存在,不存在则创建if [ ! \( -e $SrcFullFileName \) ]thenif [ ${SrcFullFileName#${SrcFullFileName%?}} = "/" ] thenmkdir -p $SrcFullFileNameelseParentDir=${SrcFullFileName%/*}if [ ! \( -e $ParentDir \) ]thenmkdir -p $ParentDirfitouch $SrcFullFileName fifi#判断目标文件是否存在,if [ ! \( -e $DstFullFileName \) ]thenif [ ${DstFullFileName#${DstFullFileName%?}} = "/" ] thenmkdir -p $DstFullFileNameelseParentDir=${DstFullFileName%/*}if [ ! \( -e $ParentDir \) ]thenmkdir -p $ParentDirficp $SrcFullFileName $ParentDirfielseif [ ! \( -d $DstFullFileName \) ]thencp $SrcFullFileName ${DstFullFileName%/*}fififi}done < $FILENAME}#删除临时文件function DelTempFiles(){if [ -e $1 ]thenfor FileName in `find $1`doif [ ${FileName#$FileName%?}} = '~' ]thenrm -rf $FileNamefidonefi}CopyFilesDelTempFiles $SrcBaseDirDelTempFiles $DstBaseDir</span>
调用: ./copyfiles.sh test.txt
下面是C++的实现代码:
<span style="font-size:18px;">#include <boost/filesystem.hpp>#include <iostream>#include <fstream>#include <vector>#include <algorithm>using namespace boost::filesystem;using namespace std;int main(int argc, char **argv){ if (argc <= 1) { cout << "please specify the file list name!" << endl; return 0; } if (!is_regular_file(argv[1])) { cout << "It's not a regular file or file does not exists!" << endl; return 0; } vector<string> VecFiles; ifstream File(argv[1]); copy(istream_iterator<string>(File), istream_iterator<string>(), back_inserter(VecFiles)); copy(VecFiles.begin(), VecFiles.end(), ostream_iterator<string>(cout, "\n")); File.close(); if (VecFiles.size() <= 2) { cout << "No files need to copy" << endl; return 0; } if (VecFiles[0].find(':') != 1 && VecFiles[0].find('/') != 0) { cout << "Basic source path is not right!" << endl; return 0; } if (VecFiles[1].find(':') != 1 && VecFiles[1].find('/') != 0) { cout << "Basic destination path is not right!" << endl; return 0; } for (vector<string>::iterator it = VecFiles.begin() + 2; it != VecFiles.end(); ++it) { path FromPath(VecFiles[0]); path ToPath(VecFiles[1]); FromPath /= (*it); ToPath /= (*it); if (is_directory(FromPath)) { if (!is_directory(ToPath)) { create_directories(ToPath); } } else { if (!is_directory(ToPath.parent_path())) { create_directories(ToPath.parent_path()); } copy_file(FromPath, ToPath, copy_option::overwrite_if_exists); } } return 0;}</span>
该程序是基于命令行的,调用:copyfiles test.txt
感觉用Shell做的还是有些复杂,Shell中很多关于字符串操作的函数都很晦涩难懂,我用的是POSIX Parameter Expansions,而且Shell脚本的语法也很怪异。C++就不同了,可以直接将boost中的那些类拿过来用,有了它们就可以少写很多代码。当然前提是你的电脑上要安装boost库,我使用的是boost 1.55.0,是最新版本的,开发环境是Visual Studio 2010。
0 0
- 基于文件列表批量拷贝文件
- 如何批量拷贝文件
- linux shell批量拷贝文件
- VC批量拷贝,移动,删除文件---SHFileOperation
- expect无信任远程批量拷贝文件
- 基于命令的批量修改文件内容
- 基于命令的批量修改文件内容
- 基于命令的批量修改文件内容
- 基于命令的批量修改文件内容
- 基于Spring CommonsMultipartResolver批量上传文件
- 基于命令的批量修改文件内容
- 批量编译vb6文件并拷贝到指定目录
- ubuntu下scp批量拷贝文件不需输入密码
- ubuntu下scp批量拷贝文件不需要输入密码
- 1.shell实用脚本:批量拷贝相同类型的文件
- linux批量修改密码、拷贝文件至远程机器
- 文件拷贝
- 拷贝文件
- MySQL按年龄段查询
- 一个关于tomcat乱码的问题
- 使用zoom、overflow解决IE6、IE7、火狐浏览器下嵌套容器清除浮动问题
- 用TorToiseGit来管理github上的项目
- C++ 结构体/枚举总结
- 基于文件列表批量拷贝文件
- uboot学习
- The 'Microsoft.ACE.Oledb.12.0' provider is not registered on the local machine
- jQuery写组件适当暴露
- xcode 证书清理
- 从太极助手事件看移动应用市场
- Chromium源码获取与编译--附加一个简单例子的编译
- C++通过虚函数表调用虚函数
- resolveUri failed on bad bitmap uri: android.graphics.Bitmap@40527328解决方法