VSFTP实时文件名转码脚本

[TOC]
事情是这样的:公司需要我搭一台vsftp服务器用来pdf文件用户程序的处理和存档。但是上传方上传上来的是GBK编码,而linux下使用UTF8编码,已经运行了几年的服务器更改系统编码已是不可能,于是想到对VSFTP进行更改。经过不断的google+baidu,发现vsftp并不能实现中文名转码的功能,于是自己写一个小脚本,使用到inotifywait和convmv。

inotify是一个很好的文件系统实时监控工具,用的地方很多。于是想到监控FTP目录下文件的CLOSE状态,确保文件被写完之后再进行文件名跟改,防止在更改的时候FTP继续写文件出错。
转码用convmv工具,进行编码转换。convmv默认以测试方式运行,不会对真实文件进行文件名替换,--notest 参数用于解除test模式,-f指定源编码模式,-t指定目标编码模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash

ftpDir=/data/ftp/

#首次启动对FTP目录进行编码转换,防止脚本意外终止导致编码没有转换的问题
find $ftpDir -type f -name *.pdf | xargs convmv -f GBK -t UTF-8 --notest

#监听FTP目录,遇到CLOSE状态的文件进行编码转换,忽略目录
inotifywait -rmq -e close $ftpDir | while read line
do
k=`echo $line | grep -v ISDIR`
if [ -z "$k" ]
then
continue
fi
ftpFile=`echo $line | awk '{print $1$3}'`
convmv -f GBK -t UTF-8 --notest $ftpFile >> /var/log/convmv.log
done

0%