404频道

学习笔记

长期以来在使用gdb调试代码的时候都会因为调试代码的时候查看代码不方便而烦恼,gdb的list命令不够好用。而且网上的教程中也确实不容易发现可以替代gdb的好的终端下的调试工具,对于图形界面的集成开发环境(比如Eclipse CDT)和图形界面的调试工具(比如DDD)不在本文讨论的范围内,毕竟很多时候连接linux的时候还是终端方式的居多。

tui模式

直到后来偶然间发现了gdb的-tui参数,该参数通过文本用户界面模式进行调试代码,使用起来确实方便了许多,再也不用边调试边list代码了,该模式已经满足了我的边调试边查看代码的需求。另外,gdbtui命令也可完成相同的功能。一个tui调试模式的界面如下:

gdb -tui

虽然,tui模式大大的提供了调试的友好性,但是仍然有一些缺点。比如显示的代码无法语法高亮,虽然会很影响用户体验,但是我毕竟是一名后台开发的程序员,这点可以忽略不计。源码布局和gdb命令布局之间切换不够方便,这点也不要紧,毕竟可以切换,只是需要输入两个单词就可以切换了。最最有问题的就是,该命令使用的时curses库,当用ssh通过windows下的SecureCRT或者putty连接进行调试时,源码布局部分往往不能够自动刷新,需要手工输入CTRL+L来刷新,具体的原理我没有去深究。

cgdb

主要是本着解决gdb tui中的源码布局不能自动刷新的问题,本文的重点cgdb命令终于闪亮登场了。该命令不仅解决了源码布局自动刷新问题,同时也支持了语法高亮,同时源码查看支持vi的部分命令。功能基本跟vimgdb相近,但是安装更容易,在ubuntu下只需执行sudo apt-get install cgdb即可。

cgdb

下面是一些常用命令:

ESC:切换焦点到源码模式,在该界面中可以使用vi的常用命令

i:切换焦点到gdb模式

o:打开文件对话框,选择要显示的代码文件,按ESC取消

空格:在当前行设置一个断点

参考文章

Beej’s Quick Guide to GDB
cgdb

最近买了本新书《深度探索Linux操作系统》,在按照书中步骤学习的过程中,无奈在安装步骤中出错,于是只能到网上找书评。在浏览书评的过程中偶然看到LFS三个名词,google之,发现是手动安装Linux的官方学习手册,学习之。

解压命令

一直对解压命令的参数记不清楚,记录一下:
tar -Jvxf *.tar.xz
tar -zvxf *.tar.gz
tar -xvf *.tar.bz2

将一般用户可以使用sudo命令执行命令的方法

执行visudo命令来修改文件内容,将本用户添加到文本文件中。修改的文件为/etc/sudoers,该文件默认为只读的,但是可以通过visudo命令来修改。

login shell和non-login shell

login shell:shell会重新读取/etc/profile和/.bash_profile来应用新的环境变量。通过su - 用户名的方式登录为login shell方式。
non-login shell:此时shell不会读取/etc/profile和
/.bash_profile,而是读取~/.bashrc来应用新的环境变量。通过su 用户名登录的方式为non-login shell方式。

文中lfs用户下的~/.bash_profile的内容如下:

1
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash

而lfs用户下的~/.bashrc文件的内容如下:

1
2
3
4
5
6
7
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH

而最令人奇怪的是即使通过su - lfs命令登录也会执行到.bashrc文件的内容,不信可以通过在.bash_profile和.bashrc文件的开始地方打印内容来验证。之所以出现如此奇怪的问题,原因在于~/.bash_profile中的命令。其中exec命令和linux系统中的exec系列函数的含义是一致的,即在当前bash中直接执行exec后面的命令,而不用fork一个新的进程来执行。env命令会通过当前用户的HOME和TERM环境变量及自定义的PS1环境变量来执行新的/bin/bash,而新执行的bash为non-login shell方式,因此会执行lfs用户下的.bahsrc文件。

总结一下,就是~/.bash_profile文件中的env命令通过non-login shell方式执行了新的bash,exec命令的作用是不在当前bash中执行新的bash,而不是通过产生一个新进程的方式来执行bash。

POSIX && FHS && LSB

POSIX.1-2008,通过该网站来查询系统函数等非常方便。
Filesystem Hierarchy Standard (FHS)
Filesystem Hierarchy Standard (FHS),可以通过此标准来学习Linux的目录含义。
Linux Standard Base (LSB) Specifications

set +h

The set +h command turns off bash’s hash function. Hashing is ordinarily a useful feature—bash uses a hash table to remember the full path of executable files to avoid searching the PATH time and again to find the same executable.

虚拟终端PTYs

PTY 设备与终端设备(terminal device)相类似——它接受来自键盘的输入,并将文字传递给运行在其上的程序以备输出。PTY 被依次编号,且每个 PTY 的编号就是它在 /dev/pts 目录中对应设备文件的文件名。

devpts file system

远程登陆(telnet,ssh等)后创建的控制台设备文件所在的目录。

specs文件

gcc 是一个驱动式的程序. 它调用其它程序来依次进行编译, 汇编和链接. GCC 分析命令行参数, 然后决定该调用哪一个子程序, 哪些参数应该传递给子程序. 所有这些行为都是由 SPEC 字符串(spec strings)来控制的. 通常情况下, 每一个 GCC 可以调用的子程序都对应着一个 SPEC 字符串, 不过有少数的子程序需要多个 SPEC 字符串来控制他们的行为.

查看当前shell

  1. 查看默认shell可以用命令:echo $SHELL
  2. 查看当前shell:ps | grep $$ | awk '{print $4}'
  3. 通过输入一个不存在的命令来查看,如输入tom,可显示bash: tom: command not found,说明当前的shell为bash。

expect

一种提供自动交互的脚本语言。

tee命令

重定向输出到多个文本文件命令。

pkg-config

configure脚本在检查相应依赖环境时(例:所依赖软件的版本、相应库版本等),通常会通过pkg-config的工具来检测相应依赖环境。

详细内容见:简述configure、pkg-config、pkg_config_path三者的关系

2013年在不经意间过去了,总结起来收获还是不小的。我的大部分业余时间用在了学习上,看书看书再看书。每个周五或周六晚上会玩上一晚上dota以放松,周末会抽一天时间出去散散心。

学习

学习上进步还算比较大,学习方式以看书为主,尤其是对Linux有了较深入了解。在年初的时候制定了深入学习Linux的计划,包括Linux内核,大约从五月下旬开始学习。

信息系统项目管理师

当时抱着该考试可以挂靠的心态来学习PM,从春节后开始学习,五月末考试,大约花了三个月时间。学习思路为从淘宝上买的YY讲课的培训视频,价格还算便宜,隔一天晚上上一课,一次讲课时间在一个半小时左右。听了几次课之后就发现老师废话挺多,但是如果自己看书复习又抓不住重点,因此还是硬着头皮听老师讲课,就当作休息了。参考图书共三本,加起来足够2000页的样子,还做了历年的部分真题。由于自己手懒,写作在考试之前没有写过一篇,只是在考试之前背了两篇范文,结果考试的时候写作没有压中,离分数线差了两分。

下半年考试没有报名,经过了一次考试后看清了PM的真面目,纯属搞理论,距离实际太远。如果为了挂靠去花费宝贵的业余时间来学习实在有点不得不偿失。现在回想起来多少有些后悔,但是不尝试怎么能知道PM到底是个啥东西呢。

Linux

Linux的系统知识今年进步挺大的,无论是在编码、对系统的理解还是内核方面都有非常大的进步。

《鸟哥的Linux私房菜–基础学习篇》

两年多前看过一次,利用工作中的空闲时间重新回顾了一边,收获还是挺大的。

《鸟哥的Linux私房菜–服务器架设篇》

两年前买的书,当时没有通读,感觉含金量跟基础学习篇太大。利用工作之余通读一遍,收获也还算可以。

《Unix环境高级编程》

Linux编程圣经,花了接近两个月时间看完,看完后收获很大。

《Unix网络编程》

Linux网络编程圣经,花了一个月时间看完,看完后对写TCP/IP通信的程序很有帮助,作为《Unix环境高级编程》的很好补充。

《Linux内核完全剖析》

该书花了我接近半年的时间来学习,现在看完了五分之四左右,还有文件系统章节没有学习。学习下来收获很大,后续会结合《Linux内核图解》一书来补充学习和归纳。

《程序员的自我修养》

通过学习对Linux的elf和windows的pe结构都有了较深入的了解,不过事隔半年之后已经全部忘记了,需要再温习一遍。

微信公共帐号

从年初开始,每天会花一定时间来阅读微信公共帐号的文章,初期订阅的文章基本都会阅读,后期订阅量大了有些就仅浏览标题了。我订阅的公共帐号里比较好的有:鬼脚七、道哥的黑板报、小道消息、Mac Talk等。鬼脚七写人生类的文章我比较喜欢看,也比较赞同作者的观点。

其他

###《30天自制操作系统》
从2012年年底开始读的图书,花了接近三个月的时间通读,读到中间部分还反过头来重读一遍。学习到三分之二的时候感觉对我用处不大,因为不会对我理解Linux或Windows操作系统有太大帮助,放弃之。

《Hadoop权威指南》

项目需要,对Hadoop没有足够的兴趣,理解了是怎么回事对我就足够了。同时还研究了Solr、HBase、MonogoDB等大数据软件。

《Git权威指南》

向对Git有进一步的理解,目前仅看完了一半,分支管理部分还没有学习。

###《浪潮之巅》
吴军博士的经典,我主要拿来在看书看累的时候消遣用,和《黑客与画家》的效果相当,很抱歉看了大半年了到现在仍然在看。

《深度探索C++对象模型》

之前曾一度要学习,无奈一直没有看进去,lippman写的和侯捷翻译的实在是诡异。这次边写博客记录边看,居然效果很不错。最后时间有限,留了个小尾巴没有看完。

工作

由于之前的公司经营不善,加上今年全国经济形式不好,公司持续几个月发不下工资来,考虑到个人经济状况换了一份工作。在济南这种小地方,找个理想的工作实在是不容易,甚至今年很多公司都不再招聘。我找工作以技术为导向,家附近一堆做电信BOSS的外包公司,一概不考虑。新工作还算可以,依旧加班较少,只是周六是间歇性上班,这个可以忍,还算有较充足的业余时间来学习。

工作中用到的技术以C、C++为主,兼涉及到Android、PHP等。从元旦之后上班第一天,自己单打独斗从零开始做了一个短信管家类项目,到五月份后终止,结果跟我预想的完全一致,以失败而告终。回想当初真该将我当时对项目的看法跟领导沟通一下,而不是盲目的接下公司安排的任务。当时领导对互联网、APP的理解完全是幼稚园水平,一家传统行业的软件企业想来玩转互联网行业困难可想而知,我作为唯一的项目成员在项目的开始已经看到了没有任何意外的结局。如果当初将这五个多月的时间用来做些Linux的东西,对我个人的成长将是相当巨大的。

生活

2013经济上不是很宽裕,没有旅游,仅有的一次市外旅游是南部山区的红叶谷。在济南这种地方,工资压得低,技术牛人又少,实在悲剧。生活虽然对我少了些许精彩,但过的还算比较充实。

博客

为了能够更好的总结学习经验,年初准备有写博客的计划。之前零零散散的也写过一些,没有坚持住,现在看来我的博客写作计划坚持的还算不错,从6月份到年底共写了40篇博客,大都是自己的学习经验总结。前期博客写了一些非技术类博文,后期觉得没有这个必要不再写非技术类博客。

为了搭建博客,又不想花钱买个不稳定的空间。我研究了Github上的jekyll、基于网盘(DropBox、Google Driver)的Farbox等搭建博客技术,参照了大量的jekyll主题,几乎将jekyll wiki上列出的主题都看了一个遍,也没有发现一个令我非常满意的主题,后挑选一个主题在Github上实验,不知是我markdown语法写的问题还是Github对markdown的解析问题,解析效果不够理想,但是我写的markdown在Farbox上却没有问题。最后采用了Farbox作为博客平台,并对Farbox的默认主题进行了少量修改。并从Godaddy上购买了kuring.me域名。

2014年计划

2014,除了工作之外,我也业余时间仍然会大部分奉献给阅读书籍,以Linux内核方向为主。趁着年轻,多读些书,永远是正确的。

在Virbutal Box下安装CentOS虚拟机,在安装完Virtual Box增强功能后在分辨率列表中,仍然没有适合屏幕的分辨率1600*900。本文将通过xrandr命令来修改当前屏幕的分辨率。

一. 执行xrand -q列出当前系统中已有的分辨率。显示内容如下:

1
2
3
4
5
6
7
8
Screen 0: minimum 64 x 64, current 1024 x 768, maximum 32000 x 32000
VBOX0 connected 1024x768+0+0 0mm x 0mm
1024x768 60.0*+ 60.0*
1600x1200 60.0
1440x1050 60.0
1280x960 60.0
800x600 60.0
640x480 60.0

需要特别注意的是VBOX0,代表显示器的名字,下面会用到。

二. 执行cvt 1600 900命令列出分辨率1600*900需要的参数,后面会用到。显示内容如下:

1
2
# 1600x900 59.95 Hz (CVT 1.44M9) hsync: 55.99 kHz; pclk: 118.25 MHz
Modeline "1600x900_60.00" 118.25 1600 1696 1856 2112 900 903 908 934 -hsync +vsync

该命令列出的内容下文会用到。

三. 执行xrandr --newmode "1600x900_60.00" 118.25 1600 1696 1856 2112 900 903 908 934 -hsync +vsync命令,该命令中的参数是参考步骤2中的输出信息。

四. 执行xrandr --addmode VBOX0 1600x900_60.00来向系统分辨率组中添加分辨率1600*900。其中VBOX0为步骤1获取的显示器名字,1600x900_60.00为步骤3添加的分辨率模式。

五. 执行xrandr --output VBOX0 1600x900_60.00来应用刚才添加的分辨率。这样屏幕就可以更改为正确的分辨率了。

网桥工作在数据链路层,将两个LAN连起来,根据MAC地址来转发帧。Linux下要配置网桥的方法有两种,一种是通过修改配置文件,另外一种是通过brctl工具。修改配置文件的方式是通过修改/etc/sysconfig/network-scripts/ifcgg-eth*文件来完成的,这种方式没有仔细研究。本文将编写两个脚本来完成网桥的创建和删除,脚本的功能为将机器上的网卡eth1和eth2桥接,而网桥本身未设置ip。

网桥创建脚本

本脚本利用brctl命令将网卡eth1和eth2桥接,可以通过brctl show命令查看结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
# 脚本作用为将两个网卡桥接

# 检测brctl命令是否存在
brctl > /dev/null
if [ $? != 1 ]; then
echo Command brctl not exist, please setup it. The setup execute command is \"yum install bridge-utils\"
exit 0
fi

# 检测网桥br0是否存在,如果存在首先删除
declare -i result=$(brctl show | grep eth0 | wc -l)
if [ $result > 0 ]; then
echo detect the bridge br0 have already exist, first delete it
ifconfig br0 down
brctl delbr br0
fi

ifconfig eth1 0.0.0.0
ifconfig eth2 0.0.0.0
brctl addbr br0
brctl addif br0 eth1
brctl addif br0 eth2
ifconfig br0 up
echo create bridge br0 success, you can use command : \"brctl show\" to check

网桥删除脚本

本脚本将桥接网卡br0删除

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

# 检测是否存在网桥br0
declare -i result=$(brctl show | grep br0 | wc -l)
if [ $result == 0 ]; then
echo "bridge br0 not exists, exit immediately"
exit 0
fi

# 删除网桥br0
ifconfig br0 down
brctl delbr br0
echo "delete bridge br0 success"

注意事项

brctl命令创建的桥接网卡在机器重启后会删除,最好将创建桥接网卡的命令放入到linux的开机启动脚本中,这样每次开机的时候都可以自动创建桥接网卡了。

参考网址

bridge命令介绍

本文提供简易shell脚本来更改mac地址,在其他linux发行版中去掉sudo即可。脚本内容如下:

1
2
3
4
#!/bin/sh
sudo ifconfig eth0 down
sudo ifconfig eth0 hw ether 08:00:27:DF:B3:7B
sudo ifconfig eth0 up

[TOC]

VNC(Virtual Network Computing)是一套由AT&T实验室所开发的可操控远程的计算机的软件,其采用了GPL授权条款,任何人都可免费取得该软件。VNC软件主要由两个部分组成:VNC server及VNC viewer。用户需先将VNC server安装在被控端的计算机上后,才能在主控端执行VNC viewer控制被控端。VNC与操作系统无关,因此可跨平台使用,例如可用Windows连接到某Linux的电脑,反之亦同。

该软件在RedHat或CentOS中默认是安装的,但是没有启用,一可以通过which vncserver命令来查看该命令是否安装。本文讲解在Linux下的搭建server,在Windows下搭建client的步骤。

设置vncserver的密码

vncserver需要设置一个密码,该密码并不等同于系统帐号的密码,而是vnc客户端登录的时候输入的密码。执行vncpasswd命令来创建密码。

修改vncserver配置文件

修改文件/etc/sysconfig/vncservers,在该文件末尾添加如下内容:

1
2
VNCSERVERS="1:root"
VNCSERVERARGS[1]="-geometry 1024x768 -alwaysshared -depth 24"

启动vncserver

执行service vncserver start命令来开启vncserver服务。

客户端连接到服务端

这里采用windows下的vnc viewer工具来连接到vncserver。在输入IP的地方输入:IP地址:1来连接到vncserver端,其中:1要跟/etc/sysconfig/vncservers文件中的对应标号一致。这样就可以连接上vncserver,但是连接后界面非常简单,跟命令行界面类似。还需要对vncserver进一步配置。

配置vncserver

vncserver的配置文件在~/.vnc/xstartup文件中,该文件默认创建的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh

# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
twm &

将其中的注释打开,即文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/sh

unset SESSION_MANAGER
exec /etc/X11/xinit/xinitrc

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
twm &

然后执行service vncserver restart重新启动vncserver服务。客户端再重新连接vncserver既可以看到正常的界面了。

参考文章

CentOS Linux下VNC Server远程桌面配置详解

上次文章《Windows和Linux之间的中文编码问题》中提到的在Windows下的源代码程序放到Linux下出现中文编码问题,解决方法为通过iconv工具转换源代码文件的编码为UTF8格式。最近多学习了些字符编码的知识,发现了解决此问题的另外一种办法。

基础知识

我们在编译程序的时候会涉及到几个编码问题,包括C++源文件的编码、C++程序的内码和运行环境编码,其中C++程序的内码较难理解。

C++程序的内码是指在可执行文件中字符串常量是以什么编码形式存放的,其中字符串常量为窄字符形式。在Windows系统中C++的内码通常为GB18030,在Linux下的gcc/g++使用的内码默认为utf8,可以通过fexec-charset参数来修改。

运行环境编码即为操作系统的编码,通常情况下,简体中文Windows操作系统编码为GB18030,而Linux下默认为UTF8。

gcc命令的参数

gcc有两个参数可以用来解决编码问题。
-finput-charset:用来指定源文件的编码。
-fexec-charset:用来指定生成的可执行文件的编码。

如果这两个参数均未指定,则GCC不会对编码进行转换。
以上这两个参数就可以用来在不修改源文件编码的基础上来达到正确的效果,达到和上篇文章中解决问题同样的效果。

关于Unicode编码

一直对Unicode编码比较糊涂,Unicode只是编码方法规范,而不是具体的存储方法。
常用的Unicode又分为UCS-2和UCS-两种编码,其中UCS-2采用固定的2个字节存储,UCS-4采用固定的4个字节存储。
通常情况下提到的Unicode编码即为UCS-2编码,比如Windows记事本中的保存为Unicode编码,其实就是保存为了UCS-2编码,由于每个字符均为2个字节,所以下次读取的时候仍然可以通过存储格式还原出来。

参考文章

字符编码笔记:ASCII,Unicode和UTF-8
字符编码详解
关于c++的一些编码问题

最近设置一个Linux下的截屏程序的开机自启动,Linux的XWindow系统为gnome。

最先想到的方式是修改/etc/inittab文件,因为Linux在开机自启动的时候会执行该文件,该文件的读取时机是在界面启动之前。我写了一个在main函数中睡眠10分钟的小程序,然后将程序添加到/etc/inittab文件中,结果开不了机了,因为需要睡眠10分钟后才能往下执行程序。幸好我用的虚拟机做的测试,并且在做测试之前备份了虚拟机。

仔细想一下在/etc/rc.d/rc.local文件中启动截屏程序肯定是不合适的,因为如果用户默认是以运行级别非5启动,则程序仍然会被调用,但是没有XWindow,谈何截屏。

接下来考虑将程序放到/etc/rc5.d目录下,这样就可以保证程序在XWindow环境下运行了。仔细一想也不合适,rc5.d仅在系统启动时运行,而Linux系统是多用户系统,允许多个用户同时登陆,多个用户登陆时截屏程序会怎样处理呢?这样显然不合适。

然后想到程序既然为截屏程序,多个用户登陆的时候应该有几个用户就跑几个程序,这样才能保证每个用户的屏幕都能截取到。因此应该放到用户登录后的启动程序列表中。类似于windows系统中的开机启动项。我用的桌面为gnome,找到了gnome-session-properties命令来启动添加程序启动的界面,然后将我的程序添加到界面中即可。

如果桌面系统为KDE,则应该也可以找到相关的设置界面。

题外:利用/etc/inittab和rc5.d目录下添加脚本的方式来启动程序的用户为root,很多程序未了避免root权限带来的安全问题,程序内部采用了su - 用户名的方式切换到一半用户执行代码。程序还可以通过chroot的方式更改根目录的路径达到保护系统的目的。

在开发Linux程序的时候通常会在Windows下编码,然后拿到Linux下编译调试。而两个操作系统之间的默认编码往往有差别。

文件编码问题

在Windows下查看文件编码可以使用记事本打开文件,然后点击“另存为”在右下角即可看到当前文件的编码方式。如果显示为ANSI编码,在简体中文系统下,ANSI 编码代表 GB2312 编码。不同 ANSI 编码之间互不兼容,ANSI是American National Standards Institute的缩写, 记事本默认是以ANSI编码保存文本文档的。

在Linux可以通过vi命令查看文件编码,用vi打开文件,然后输入:set encoding即可显示文件编码。

在VS2008中创建文件的默认编码是根据当前系统的编码格式确定的。VS2008编译器可以同时支持GB2312和UTF-8两种编码。

为了解决在Linux下的乱码问题,Linux下的编码格式为utf8编码,这里采用在Windows下将gb2312编码更改为utf8的方式来解决。iconv是一个可以转换文件编码的工具,编写一个批处理脚本来实现批量转换文件编码的功能。批处理文件的内容如下:

1
2
3
4
5
6
7
@ECHO OFF
FOR /R %%F IN (*.h,*.cpp) DO (
echo %%~nxF
iconv.exe -f GB2312 -t UTF-8 %%F > %%F.utf8
move %%F.utf8 %%F >nul
)
PAUSE

本脚本来自网络,不是我自己写的。
注意:在使用文件编码之前一定要备份文件,防止意外发生,否则后果自负。

文件名编码问题

Windows的中文系统下文件名的编码默认为gbk,在Linux默认编码为UTF-8。如果将Windows下的中文文件名的文件复制到Linux下肯定会出现乱码的问题。可以利用convmv工具来解决编码的问题。

具体执行操作为:在Linux系统下的要转换编码的目录下执行命令:convmv -f GBk -t UTF-8 --notest -r *,这样就会将该文件夹下的所有文件递归的转换编码为UTF-8。

convmv的帮助文档点这里

相关下载

脚本和iconv程序下载链接

0%