本文为原创文章,转载注明出处,欢迎关注网站https://hkvision.cn

filetools工具

本人用golang写的一个小工具,用于对文件进行操作,项目地址在这:filetools

安装

暂时无法直接提供编译好的二进制文件,等我啥时候有时间了研究下CI工具再说。

现在已经可以提供二进制下载了,去github release上找就行,想安装最新版的可以从源码安装

go get -u github.com/haokunt/filetools/...

源码安装需要你有go环境,目前没有测试最低版本,1.11+都是可以的。

使用

最初写这个工具的设想是将很多命令整合到一起,像cp,mv,rm等,所以所有功能均使用子命令的方式进行提供,可以用-h来查看使用帮助。对于子命令也可以在后面加上-h查看子命令使用帮助。

中文帮助

项目已经可以实现国际化,设置正确环境变量即可看到中文帮助。

设置LANG环境变量即可

# Linux
export LANG=zh_CN
# Windows
set LANG=zh_CN

已实现的功能

comapre

compare用于比较两个目录的不同,使用golang的os.Stat函数获取文件信息,比较大小和文件名两方面,加上-c参数则会打开每个文件进行详细比较。比较信息将打印在控制台,包括new file, modified file(文件名一样但是大小不一样或者), deleted file。

使用场景是在进行目录复制的时候,如果中途断了,或者一些其他情况,导致我们无法判断目录是否复制成功,可以进行比较。

copy

copy将一个文件或者目录拷贝到其他地方,这个命令最激动人心的地方是有进度条,加上-pb即可,有进度条的情况下会先统计源目录,因此速度会慢一些,我自己使用的时候是40w个文件统计需要花一段时间,不过不太长,可以接受。

使用场景是在对大文件,大目录进行拷贝的时候可以加上进度条,灰常舒爽

info

info命令会输出文件或目录的一些信息,这些信息包括文件名,文件类型(真实类型),文件大小(真实目录大小),权限等,v0.21版本之后这个命令重构了,用了协程之后速度飞起(绝对比Windows自带的快)

使用场景是探测真实文件类型,在Linux下统计真实目录大小

rename

rename命令会重命名文件,加上-k参数可以保持原有文件(类似copy,但不支持目录)

使用场景略

list

list命令会列出目录下的所有文件,这个命令可以排序,可以限制输出到控制台的数量

使用场景是对某目录下的大文件进行查找,快速定位哪些文件占用了较多的磁盘空间

delete

delete命令是用来删除目录或者文件的,默认情况下这个命令执行软删除,直接删除可以用-hd参数。软删除会删除到~/.ft-trash目录下

正如我在github上写的那样,本来我想通过调用windows api来实现在windows环境下软删除是移动到回收站的功能,但是找了一圈发现网上推荐的方法是调用SHFileOperationA这个函数(DeleteFile函数我试过,直接删除了),但是这个函数的参数是一个C结构体,这意味着,要么我装个VS,用cgo来实现,要么我弄个Go结构,模仿这个结构,然后用cgo的那一套,unsafe.Pointer拿到指针,直接调用dll。前一种方案很传统,实现起来问题不大,但是那就正式使用cgo,这是我不能容忍的,本来这个项目我就打算用纯go写,后一种方案我没尝试过,理论上来说是可以的,但是最大的问题是go结构能否保证和c结构一样,即使我每一个字段都按照c结构来,还有内存对齐的问题,还有32位和64位的问题,总之这个解决方案即使成功了,可能也就只能我自己用用,想有普适性很困难。另外考虑到所有系统实现一致性的问题,我还是决定不扔回收站了。

PS: 可能有人会问了,说我直接找到回收站在什么地方然后移过去不就行了。我考虑过这个问题,应该说我最先想到的就是这个方案,但是我发现Windows的回收站比想象中复杂,最大的问题是文件命名,大家应该知道回收站里面的文件是可以重名的,然后我跑去回收站一看,呵呵,里面真实的文件名是一串生成的乱码,也会带名字但是前缀是乱码,咱也不知道这个乱码咋生成的,网上也没找到资料,如果有谁知道这串码怎么生成的,请告诉我,我会用go实现的。

未来会开发几个针对~/.ft-trash目录的功能,例如查找文件,清理回收站等

move

move用来移动文件或目录,和mv差不多,但是就是有些报错和mv不一样,也可能是我测试的平台不一样,总之我尽可能的考虑了一些极端情况,大家使用过程中遇到了什么bug请告诉我。

未来的打算

未来将提供更多的文件相关的功能,要是有什么好的建议可以提issues。

目前打算再加一个支持正则的功能,这样前面的命令可以实现更丰富的功能