shell脚本因文件编码问题不能正确执行的问题

遇到一例因shell文件的编码问题导致执行后不能得到正确结果的问题。一般来说脚本中不会带有中文,不过有时候例外,例如你要查找一个文本中的字符串,cat test.txt | grep "汽车"  这样的命令,如果文件编码不对,就可能得不到正确结果。

阅读更多

C++程序中统计一个目录下的文件数量

转载请注明出处:http://www.codelast.com/

 

如果一个目录下不包含其他目录,只有文件,怎么得到文件数量?这么容易的一个问题,你会用什么方法去做?

我喜欢利用shell来帮忙:

在程序中构造shell命令:ls 目录名 | wc -l

然后执行它,得到返回的结果,就结束了。

执行一个shell命令并获取其返回结果的函数示例:

std::string getCmdRes(const std::string sc)
{
  FILE* crs = popen(sc.c_str(), "r"); // execute the shell command
  char result[1024] = "0";
  fread(result, sizeof(char), sizeof(result), crs);
  if (NULL != crs)
  {
    fclose(crs);
    crs = NULL;
  }
  std::string res = result;
  return res;
}

将shell命令作为参数传入,返回的就是执行结果了,简单吧。

类似地,如果有其他可以用shell命令很容易实现的运算,我们也可以这样“偷懒”,直接在C++里“调用”它。

文章来源:http://www.codelast.com/

shell读取文件的 指定行/第N行 字符串

文章来源:http://www.codelast.com/

 

命令:

sed -n Np 文件名

其中,“N”必须替换成一个数字,例如,你要取文件1.txt的第7行,命令为: 

sed -n 7p 1.txt

输出结果即为指定行内容。

文章来源:http://www.codelast.com/

ifstream多次读取文件

 

未测试,但在 http://blog.csdn.net/clever101/archive/2008/05/17/2453924.aspx 看到一说,记下来以备后用:

用std::ifstream来读取一个文件完成后,需要close(),然后再用该ifstream对象立即打开另一个文件,会失败,必须要在close()之后调用ifs.clear(ios::goodbit) 之后(ifs为std::ifstream对象),才能够打开一个新文件,原因:“关闭流并不能改变流对象的内部状态。如果最后的读写操作失败了,对象的状态将保持为错误模式,直到执行 clear 操作重新恢复流的状态为止。调用 clear 后,就像重新创建了该对象一样。如果程序员需要重用文件流读写多个文件,必须在读另一个文件之前调用 clear 清除该流的状态。”

[原创]在Linux下进行文件“粉碎”/擦除

文章来源:http://www.codelast.com/

 

众所周知Windows下的文件删除之后是有可能恢复的,对重要文件,为了增加恢复的难度,我们可以用文件粉碎工具进行文件粉碎。我最常用的是集成到资源管理器中的Eraser。那么在Linux下有没有类似的软件呢?我在一台只有Ubuntu系统的主机上,安装了一个文件粉碎工具wipe,有些想法,记下来。

安装:apt-get install wipe

wipe有没有GUI我不知道,命令行也不难用:

阅读更多

[原创]在多台Windows主机间使用cwRsync来 同步/备份/传送 文件

文章来源:http://www.codelast.com/

 

如果你有多台计算机,并且你希望它们的某些目录保持一致(例如,你经常更改文件的目录),那么如果用手工复制、粘贴的方法,就太没有效率了,文件夹多的话,能把你累个半死。所以,使用一些同步软件是极其重要的。

在这里,向你推荐rsync。套用网上的解释:rsync是在Linux和UNIX上广泛使用的文件传输和同步程序。此软件相当强大,经过一些配置之后,可以让你从此以后的同步备份工作变得极其简单、轻松。该软件有Windows下的版本,叫做cwRsync。官方对它的诠释是:cwrsync - Rsync for Windows。 阅读更多