Shell内置的字符串操作符

使用shell内置的字符串操作符可以精简代码,并提高脚本运行效率,唯一的缺点可能是比较难记,所以在这里做个记录。

${var}	变量var的值, 与$var相同
${var-DEFAULT}	如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:-DEFAULT}	如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
${var=DEFAULT}	如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:=DEFAULT}	如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
${var+OTHER}	如果var声明了, 那么其值就是$OTHER, 否则就为null字符串
${var:+OTHER}	如果var被设置了, 那么其值就是$OTHER, 否则就为null字符串
${var?ERR_MSG}	如果var没被声明, 那么就打印$ERR_MSG *
${var:?ERR_MSG}	如果var没被设置, 那么就打印$ERR_MSG *
${!varprefix*}	匹配之前所有以varprefix开头进行声明的变量
${!varprefix@}	匹配之前所有以varprefix开头进行声明的变量
${#string}	$string的长度 	 
${string:position}	在$string中, 从位置$position开始提取子串
${string:position:length}	在$string中, 从位置$position开始提取长度为$length的子串
${string#substring}	从变量$string的开头, 删除最短匹配$substring的子串
${string##substring}	从变量$string的开头, 删除最长匹配$substring的子串
${string%substring}	从变量$string的结尾, 删除最短匹配$substring的子串
${string%%substring}	从变量$string的结尾, 删除最长匹配$substring的子串
${string/substring/replacement}	使用$replacement, 来代替第一个匹配的$substring
${string//substring/replacement}	使用$replacement, 代替所有匹配的$substring
${string/#substring/replacement}	如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
${string/%substring/replacement}	如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
以上内容来自http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html

recover data from binary log

转自: http://www.0550go.com/database/mysql/recover-data-from-binary-log.html

要使用mysqlbinlog 恢复数据首先必须启用过binglog,通常我们会在配置文件中添加如下选项:

vi /etc/my.cnf
log-bin=mysql-bin

当然不是等到数据损坏的时候再启用binglog,那时候已经为时已晚!

从binlog恢复数据演练:

1、创建数据库:

mysql> create database test;
Query OK, 1 row affected (0.05 sec)
mysql> use test;
Database changed

2、创建表:

mysql> create table user(id int auto_increment not null primary key, age int(3),name varchar(20));
Query OK, 0 rows affected (0.25 sec)

3、相关操作:

mysql> insert into user(age,name)values(34,'Jack');
Query OK, 1 row affected (0.01 sec)
mysql> insert into user(age,name)values(34,'bob'); 
Query OK, 1 row affected (0.11 sec)
mysql> insert into user(age,name)values(34,'max');  
Query OK, 1 row affected (0.01 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.25 sec)
插入3条记录,并刷新一次logs
mysql> insert into user(age,name)values(34,'zhoufurong');
Query OK, 1 row affected (0.03 sec)
mysql> insert into user(age,name)values(34,'jerry');     
Query OK, 1 row affected (0.04 sec)
mysql> insert into user(age,name)values(34,'mashou');
Query OK, 1 row affected (0.01 sec)
mysql> insert into user(age,name)values(34,'mead');  
Query OK, 1 row affected (0.07 sec)
mysql> delete from user where id between 5 and 7;
Query OK, 3 rows affected (0.05 sec)
mysql> insert into user(age,name)values(40, 'aaa');
Query OK, 1 row affected (0.06 sec)
mysql> insert into user(age,name)values(40, 'bbb');
Query OK, 1 row affected (0.02 sec)
mysql> flush logs;
Query OK, 0 rows affected (0.17 sec)
插入4条记录,并删除记录5-7,然后又插入2条记录

mysql> insert into user(age,name)values(40, 'ccc');
Query OK, 1 row affected (0.06 sec)
mysql> insert into user(age,name)values(40, 'ddd');
Query OK, 1 row affected (0.04 sec)
mysql> drop table user;
Query OK, 0 rows affected (0.14 sec)
mysql> show tables;
Empty set (0.00 sec)
插入2条记录,删除整个表

4、恢复数据:

总共插入了11条记录,中途删除了2条记录,最后丢弃了整张表,首先要做的我们要查询每步操作的起始pos和停目pos,因为我们要恢复所有的数据,所以中间要跳过delete操作和drop操作

首先,我们要查看binlog具体信息,通过下面命令:

mysqlbinlog mysql-bin.000001 > 1.txt
# cat 1.txt 
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#150416 16:15:41 server id 1  end_log_pos 107   Start: binlog v 4, server v 5.5.34-log created 150416 16:15:41 at startup
ROLLBACK/*!*/;
BINLOG '
rW8vVQ8BAAAAZwAAAGsAAAAAAAQANS41LjM0LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACtby9VEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
'/*!*/;
# at 107
#150416 16:16:02 server id 1  end_log_pos 190   Query   thread_id=1     exec_time=0     error_code=0
SET TIMESTAMP=1429172162/*!*/;
SET @@session.pseudo_thread_id=1/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1437073440/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create database test
/*!*/;
# at 190
#150416 16:16:45 server id 1  end_log_pos 343   Query   thread_id=1     exec_time=0     error_code=0
use `test`/*!*/;
SET TIMESTAMP=1429172205/*!*/;
create table user(id int auto_increment not null primary key, age int(3),name varchar(20))
/*!*/;
# at 343
#150416 16:18:14 server id 1  end_log_pos 411   Query   thread_id=1     exec_time=0     error_code=0
SET TIMESTAMP=1429172294/*!*/;
BEGIN
/*!*/;
# at 411
# at 458
#150416 16:18:14 server id 1  end_log_pos 458   Table_map: `test`.`user` mapped to number 33
#150416 16:18:14 server id 1  end_log_pos 501   Write_rows: table id 33 flags: STMT_END_F

BINLOG '
RnAvVRMBAAAALwAAAMoBAAAAACEAAAAAAAEABHRlc3QABHVzZXIAAwMDDwI8AAY=
RnAvVRcBAAAAKwAAAPUBAAAAACEAAAAAAAEAA//4AQAAACIAAAAESmFjaw==
'/*!*/;
# at 501
#150416 16:18:14 server id 1  end_log_pos 528   Xid = 10
COMMIT/*!*/;
# at 528
#150416 16:18:24 server id 1  end_log_pos 596   Query   thread_id=1     exec_time=0     error_code=0
SET TIMESTAMP=1429172304/*!*/;
BEGIN
/*!*/;
# at 596
# at 643
#150416 16:18:24 server id 1  end_log_pos 643   Table_map: `test`.`user` mapped to number 33
#150416 16:18:24 server id 1  end_log_pos 685   Write_rows: table id 33 flags: STMT_END_F

BINLOG '
UHAvVRMBAAAALwAAAIMCAAAAACEAAAAAAAEABHRlc3QABHVzZXIAAwMDDwI8AAY=
UHAvVRcBAAAAKgAAAK0CAAAAACEAAAAAAAEAA//4AgAAACIAAAADYm9i
'/*!*/;
# at 685
#150416 16:18:24 server id 1  end_log_pos 712   Xid = 11
COMMIT/*!*/;
# at 712
#150416 16:18:31 server id 1  end_log_pos 780   Query   thread_id=1     exec_time=0     error_code=0
SET TIMESTAMP=1429172311/*!*/;
BEGIN
/*!*/;
# at 780
# at 827
#150416 16:18:31 server id 1  end_log_pos 827   Table_map: `test`.`user` mapped to number 33
#150416 16:18:31 server id 1  end_log_pos 869   Write_rows: table id 33 flags: STMT_END_F

BINLOG '
V3AvVRMBAAAALwAAADsDAAAAACEAAAAAAAEABHRlc3QABHVzZXIAAwMDDwI8AAY=
V3AvVRcBAAAAKgAAAGUDAAAAACEAAAAAAAEAA//4AwAAACIAAAADbWF4
'/*!*/;
# at 869
#150416 16:18:31 server id 1  end_log_pos 896   Xid = 12
COMMIT/*!*/;
# at 896
#150416 16:18:36 server id 1  end_log_pos 939   Rotate to mysql-bin.000002  pos: 4
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

或者:

mysqlbinlog mysql-bin.000001 | more

当数据量不是很大的情况下,你可以这样操作:

mysql> show binlog events in 'mysql-bin.000001';
+------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                                                                                   |
+------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------------------------------------+
| mysql-bin.000001 |   4 | Format_desc |         1 |         107 | Server ver: 5.5.34-log, Binlog ver: 4                                                                  |
| mysql-bin.000001 | 107 | Query       |         1 |         190 | create database test                                                                                   |
| mysql-bin.000001 | 190 | Query       |         1 |         343 | use `test`; create table user(id int auto_increment not null primary key, age int(3),name varchar(20)) |
| mysql-bin.000001 | 343 | Query       |         1 |         411 | BEGIN                                                                                                  |
| mysql-bin.000001 | 411 | Table_map   |         1 |         458 | table_id: 33 (test.user)                                                                               |
| mysql-bin.000001 | 458 | Write_rows  |         1 |         501 | table_id: 33 flags: STMT_END_F                                                                         |
| mysql-bin.000001 | 501 | Xid         |         1 |         528 | COMMIT /* xid=10 */                                                                                    |
| mysql-bin.000001 | 528 | Query       |         1 |         596 | BEGIN                                                                                                  |
| mysql-bin.000001 | 596 | Table_map   |         1 |         643 | table_id: 33 (test.user)                                                                               |
| mysql-bin.000001 | 643 | Write_rows  |         1 |         685 | table_id: 33 flags: STMT_END_F                                                                         |
| mysql-bin.000001 | 685 | Xid         |         1 |         712 | COMMIT /* xid=11 */                                                                                    |
| mysql-bin.000001 | 712 | Query       |         1 |         780 | BEGIN                                                                                                  |
| mysql-bin.000001 | 780 | Table_map   |         1 |         827 | table_id: 33 (test.user)                                                                               |
| mysql-bin.000001 | 827 | Write_rows  |         1 |         869 | table_id: 33 flags: STMT_END_F                                                                         |
| mysql-bin.000001 | 869 | Xid         |         1 |         896 | COMMIT /* xid=12 */                                                                                    |
| mysql-bin.000001 | 896 | Rotate      |         1 |         939 | mysql-bin.000002;pos=4                                                                                 |
+------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------------------------------------+

从这个日志可以看到,mysql-bin.000001 里面是创建数据库,创建表,插入三条记录操作,并无删除记录操作!因为只删除了表,所以可以忽略库的恢复!

# mysqlbinlog --database=test mysql-bin.000001 --start-position=190 --stop-position=896 | mysql -uroot -p123456

查看数据库,表回来了!

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user           |
+----------------+
1 row in set (0.00 sec)

mysql> select * from user;
+----+------+------+
| id | age  | name |
+----+------+------+
|  1 |   34 | Jack |
|  2 |   34 | bob  |
|  3 |   34 | max  |
+----+------+------+
3 rows in set (0.00 sec)

查看mysql-bin.000002日志:

mysql> show binlog events in 'mysql-bin.000002';
+------------------+------+-------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos  | Event_type  | Server_id | End_log_pos | Info                                  |
+------------------+------+-------------+-----------+-------------+---------------------------------------+
| mysql-bin.000002 |    4 | Format_desc |         1 |         107 | Server ver: 5.5.34-log, Binlog ver: 4 |
| mysql-bin.000002 |  107 | Query       |         1 |         175 | BEGIN                                 |
| mysql-bin.000002 |  175 | Table_map   |         1 |         222 | table_id: 33 (test.user)              |
| mysql-bin.000002 |  222 | Write_rows  |         1 |         271 | table_id: 33 flags: STMT_END_F        |
| mysql-bin.000002 |  271 | Xid         |         1 |         298 | COMMIT /* xid=14 */                   |
| mysql-bin.000002 |  298 | Query       |         1 |         366 | BEGIN                                 |
| mysql-bin.000002 |  366 | Table_map   |         1 |         413 | table_id: 33 (test.user)              |
| mysql-bin.000002 |  413 | Write_rows  |         1 |         457 | table_id: 33 flags: STMT_END_F        |
| mysql-bin.000002 |  457 | Xid         |         1 |         484 | COMMIT /* xid=15 */                   |
| mysql-bin.000002 |  484 | Query       |         1 |         552 | BEGIN                                 |
| mysql-bin.000002 |  552 | Table_map   |         1 |         599 | table_id: 33 (test.user)              |
| mysql-bin.000002 |  599 | Write_rows  |         1 |         644 | table_id: 33 flags: STMT_END_F        |
| mysql-bin.000002 |  644 | Xid         |         1 |         671 | COMMIT /* xid=16 */                   |
| mysql-bin.000002 |  671 | Query       |         1 |         739 | BEGIN                                 |
| mysql-bin.000002 |  739 | Table_map   |         1 |         786 | table_id: 33 (test.user)              |
| mysql-bin.000002 |  786 | Write_rows  |         1 |         829 | table_id: 33 flags: STMT_END_F        |
| mysql-bin.000002 |  829 | Xid         |         1 |         856 | COMMIT /* xid=17 */                   |
| mysql-bin.000002 |  856 | Query       |         1 |         924 | BEGIN                                 |
| mysql-bin.000002 |  924 | Table_map   |         1 |         971 | table_id: 33 (test.user)              |
| mysql-bin.000002 |  971 | Delete_rows |         1 |        1045 | table_id: 33 flags: STMT_END_F        |
| mysql-bin.000002 | 1045 | Xid         |         1 |        1072 | COMMIT /* xid=18 */                   |
| mysql-bin.000002 | 1072 | Query       |         1 |        1140 | BEGIN                                 |
| mysql-bin.000002 | 1140 | Table_map   |         1 |        1187 | table_id: 33 (test.user)              |
| mysql-bin.000002 | 1187 | Write_rows  |         1 |        1229 | table_id: 33 flags: STMT_END_F        |
| mysql-bin.000002 | 1229 | Xid         |         1 |        1256 | COMMIT /* xid=19 */                   |
| mysql-bin.000002 | 1256 | Query       |         1 |        1324 | BEGIN                                 |
| mysql-bin.000002 | 1324 | Table_map   |         1 |        1371 | table_id: 33 (test.user)              |
| mysql-bin.000002 | 1371 | Write_rows  |         1 |        1413 | table_id: 33 flags: STMT_END_F        |
| mysql-bin.000002 | 1413 | Xid         |         1 |        1440 | COMMIT /* xid=20 */                   |
| mysql-bin.000002 | 1440 | Rotate      |         1 |        1483 | mysql-bin.000003;pos=4                |
+------------------+------+-------------+-----------+-------------+---------------------------------------+
30 rows in set (0.00 sec)

mysql-bin.000002日志,在这个日志中,有删除记录操作,所以要想全部恢复回来数据,一条不差,就得跳过delte_rows这步:

# mysqlbinlog --database=test  mysql-bin.000002 --start-position=4 --stop-position=971 | mysql -uroot -p123456 

mysql> select * from user;
+----+------+------------+
| id | age  | name       |
+----+------+------------+
|  1 |   34 | Jack       |
|  2 |   34 | bob        |
|  3 |   34 | max        |
|  4 |   34 | zhoufurong |
|  5 |   34 | jerry      |
|  6 |   34 | mashou     |
|  7 |   34 | mead       |
+----+------+------------+
7 rows in set (0.00 sec)

# mysqlbinlog --database=test  mysql-bin.000002 --start-position=1045 --stop-position=1483 | mysql -uroot -p123456
mysql> select * from user;
+----+------+------------+
| id | age  | name       |
+----+------+------------+
|  1 |   34 | Jack       |
|  2 |   34 | bob        |
|  3 |   34 | max        |
|  4 |   34 | zhoufurong |
|  5 |   34 | jerry      |
|  6 |   34 | mashou     |
|  7 |   34 | mead       |
|  8 |   40 | aaa        |
|  9 |   40 | bbb        |
+----+------+------------+
9 rows in set (0.00 sec)

查看mysql-bin.000003:

mysql> show binlog events in 'mysql-bin.000003';
+------------------+-----+-------------+-----------+-------------+---------------------------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                                    |
+------------------+-----+-------------+-----------+-------------+---------------------------------------------------------+
| mysql-bin.000003 |   4 | Format_desc |         1 |         107 | Server ver: 5.5.34-log, Binlog ver: 4                   |
| mysql-bin.000003 | 107 | Query       |         1 |         175 | BEGIN                                                   |
| mysql-bin.000003 | 175 | Table_map   |         1 |         222 | table_id: 33 (test.user)                                |
| mysql-bin.000003 | 222 | Write_rows  |         1 |         264 | table_id: 33 flags: STMT_END_F                          |
| mysql-bin.000003 | 264 | Xid         |         1 |         291 | COMMIT /* xid=22 */                                     |
| mysql-bin.000003 | 291 | Query       |         1 |         359 | BEGIN                                                   |
| mysql-bin.000003 | 359 | Table_map   |         1 |         406 | table_id: 33 (test.user)                                |
| mysql-bin.000003 | 406 | Write_rows  |         1 |         448 | table_id: 33 flags: STMT_END_F                          |
| mysql-bin.000003 | 448 | Xid         |         1 |         475 | COMMIT /* xid=23 */                                     |
| mysql-bin.000003 | 475 | Query       |         1 |         581 | use `test`; DROP TABLE `user` /* generated by server */ |
+------------------+-----+-------------+-----------+-------------+---------------------------------------------------------+
10 rows in set (0.00 sec)

mysql-bin.000003 有一个drop table操作,所以在恢复这个文件是跳过drop操作就好:

# mysqlbinlog --database=test  mysql-bin.000003 --start-position=4 --stop-position=475 | mysql -uroot -p123456
mysql> select * from user;
+----+------+------------+
| id | age  | name       |
+----+------+------------+
|  1 |   34 | Jack       |
|  2 |   34 | bob        |
|  3 |   34 | max        |
|  4 |   34 | zhoufurong |
|  5 |   34 | jerry      |
|  6 |   34 | mashou     |
|  7 |   34 | mead       |
|  8 |   40 | aaa        |
|  9 |   40 | bbb        |
| 10 |   40 | ccc        |
| 11 |   40 | ddd        |
+----+------+------------+
11 rows in set (0.00 sec)

 

数据全部取回!

注意:在进行恢复前,一定要将flush logs产生一个新的log文件,这样做是恢复操作将写入一个新的binlog,不会写入老的日志文件中,如若不然记录会接着老的日志往下写,到时查询起来就会比较凌乱了!

当日志非常多时,上面的恢复可能不太适合了,那么binlog可以按时间进行恢复:

/mysql/bin/mysqlbinlog --database=bbs --start-datetime="2013-01-22 05:00:00" --stop-datetime="2013-01-22 09:00:00" /mysql/data/mysql-bin.000001 | /mysql/bin/mysql -u root -p123456 -f

注释:
–database=bbs // 需要恢复的数据库
–start-datetime=”2013-01-22 05:00:00″ // 恢复数据起始时间
–stop-datetime=”2013-01-22 09:00:00″ // 恢复数据截至时间
/mysql/data/mysql-bin.000001 // 引用的日志文件,多个日志就多增加几条
/mysql/bin/mysql -u root -p123456 // 登录Mysql帐号密码
-f // 忽略错误,否则遇到相同条目恢复就会终止

需要注意的问题:

mysqlbinlog命令只能恢复binglog日志里有的数据
一般我们都使用expire-logs-days来限制日志保存的天数,以防止日志文件不断增大撑爆硬盘。
假设 expire-logs-days = 7
那么7天之前的数据如果被误删除将无法通过此命令恢复,比如discuz论坛,你要是误删除了某个版块,而这个版块创建已经有半年,显然版块以及版块内的所有帖子,无法使用近期的binglog日志恢复。
遇到这种情况,要想恢复数据,必须配合每天定时备份的数据来进行
假设数据是每天早上5点定时打包备份,早上9点误删了某个版块
首先恢复打包备份的数据:

service mysql stop
cd /mysql/data
tar zxvf /mysql/dbbackup/bbs20130122.tar.gz
service mysql start
/mysql/bin/mysqlbinlog --database=bbs --start-datetime="2013-01-22 5:00:00" --stop-datetime="2013-01-22 9:00:00" /mysql/data/mysql-bin.000001 | /mysql/bin/mysql -u root -p123456 -f

 

 

 

 

精选85条Linux系统管理员知识点

不错的知识总结,内容涵盖磁盘、文件系统及网络管理常用命令。花十分钟浏览一下即可获取全方位Linux基础知识。说不定什么时候就用上了呢?(内容来自网络)

1.在Linux系统中,以 文件 方式访问设备 。

2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统。

3. Linux文件系统中每个文件用 inode 来标识。

4. 全部磁盘块由四个部分组成,分别为引导块 、专用块 、 inode表块 和数据存储块。

5. 链接分为: 硬链接 和 符号链接 。

6. 超级块包含了inode表 和 空闲块表 等重要的文件系统信息。

7. 某文件的权限为:drw-r–r–,用数值形式表示该权限,则该八进制数为: 644 ,该文件属性是 目录 。

8. 前台起动的进程使用 Ctrl+c 终止。

9. 静态路由设定后,若网络拓扑结构发生变化,需由系统管理员修改路由的设置。

10. 网络管理的重要任务是: 控制 和 监控 。

11. 安装Linux系统对硬盘分区时,必须有两种分区类型: 文件系统分区 和 交换分区 。

13. 编写的Shell程序运行前必须赋予该脚本文件 执行 权限。

14. 系统管理的任务之一是能够在 分布式 环境中实现对程序和数据的安全保护、备份、恢复和更新。

15. 系统交换分区是作为系统 虚拟存储器 的一块区域。

16. 内核分为 进程管理系统 、 内存管理系统 、 I/O管理系统 和文件管理系统 等四个子系统。

17. 内核配置是系统管理员在改变系统配置 硬件 时要进行的重要操作。

18. 在安装Linux系统中,使用netconfig程序对网络进行配置,该安装程序会一步步提示用户输入主机名、域名、域名服务器、IP地址、 网关地址 和 子网掩码 等必要信息。

19. 唯一标识每一个用户的是用户 ID 和用户名。

20 . RIP 协议是最为普遍的一种内部协议,一般称为动态路由选择协议。

21. 在Linux系统中所有内容都被表示为文件,组织文件的各种方法称为 文件系统 。

22. DHCP可以实现动态 IP 地址分配。

23. 系统网络管理员的管理对象是服务器、 用户 和服务器的进程 以及系统的各种资源。

24. 网络管理通常由监测、传输和管理三部分组成,其中管理部分是整个网络管理的中心。

25. 当想删除本系统用不上的 设备驱动程序 时必须编译内核,当内核不支持系统上的 设备驱动程序时,必须对内核 升级 。

26 Ping命令可以测试网络中本机系统是否能到达 一台远程主机 ,所以常常用于测试网络的 连通性 。

27. vi编辑器具有两种工作模式: 命令模式 和 输入模式 。

28. 可以用ls –al命令来观察文件的权限,每个文件的权限都用10位表示,并分为四段,其中第一段占 1位,表示 文件类型 ,第二段占3位,表示 文件所有者 对该文件的权限。

29. 进程与程序的区别在于其动态性,动态的产生和终止,从产生到终止进程可以具有的基本状态为: 运行态 、 就绪态 和 等待态(阻塞态) 。

30. DNS实际上是分布在internet上的主机信息的数据库,其作用是实现 IP地址和主机名 之间的转换。

31. Apache是实现WWW服务器功能的应用程序,即通常所说的“浏览web服务器”,在服务器端 为用户提供浏览 web服务 的就是apache应用程序。

32. 在Linux系统上做备份可以有两种类型:系统备份 和 用户备份 。其中前者是指对 操作系统 的备份,后者是指对 应用程序和用户文件的备份。

33. CD-ROM标准的文件系统类型是 iso9660 。

34. 当lilo.conf配置完毕后,使之生效,应运行的命令及参数是 lilo 。

35. 在使用ls命令时,用八进制形式显示非打印字符应使用参数 -b 。

36. Linux使用支持Windows 9.x/2000长文件名的文件系统的类型是 vfat 。

37. 设定限制用户使用磁盘空间的命令是 quota 。

38 在Linux系统中,用来存放系统所需要的配置文件和子目录的目录是 /etc 。

39. 硬连接只能建立对 文件 链接。符号链接可以跨不同文件系统创建

40. 套接字文件的属性位是 s 。

41. 结束后台进程的命令是 kill 。

42. 进程的运行有两种方式,即 独立运行和使用父进程运行 。

43. Links分为 硬链接和符号链接 。

44. 在超级用户下显示Linux系统中正在运行的全部进程,应使用的命令及参数是 ps -aux 。

45. 管道文件的属性位是 p 。

46. 将前一个命令的标准输出作为后一个命令的标准输入,称之为 管道 。

47. 为脚本程序指定执行权的命令及参数是 chmod a+x filename 。

48. 进行远程登录的命令是 telnet 。

49. 欲发送10个分组报文测试与主机abc.edu.cn的连通性,应使用的命令和参数是: ping abc.edu.cn –c 10 。

50. DNS服务器的进程命名为named,当其启动时,自动装载 /etc目录下的 named.conf 文件中定义的DNS分区数据库文件。

51. Apache服务器进程配置文件是 httpd.conf 。

52.在 Linux系统中,压缩文件后生成后缀为.gz文件的命令是 gzip 。

53. 在用vi编辑文件时,将文件内容存入test.txt文件中,应在命令模式下键入 :w test.txt 。

54 可以在标准输出上显示整年日历的命令及参数是 cal -y 。

55. 在shell编程时,使用方括号表示测试条件的规则是:方括号两边必须有 空格 。

56. 检查已安装的文件系统/dev/had5是否正常,若检查有错,则自动修复,其命令及参数是 fsck –a /dev/had5 。

57. 在Windows9.x环境下共享Unix/Linux中的用户目录的一个工具是 Samba服务器 。

58. 系统管理员的职责是进行系统资源管理、系统性能管理、设备管理、安全管理和 系统性能监测 。

59 在Linux系统中,测试DNS服务器是否能够正确解析域名的的客户端命令,使用命令 nslookup 。

60. 在Linux系统下,第二个IDE通道的硬盘(从盘)被标识为 hdb 。

61. 当系统管理员需升级内核版本和改变系统硬件配置时,应 重新编译内核 。

62. 如果只是要修改系统的IP地址,应修改 /etc/rc.d/rc.inet1 配置文件。

63. 当LAN内没有条件建立DNS服务器,但又想让局域网内的用户可以使用计算机名互相访问时,应配置/etc/hosts 文件。

64. 在vi编辑环境下,使用 Esc键 进行模式转换。

65. Slackware Linux 9.0通常使用 ext3 文件系统,系统的全部磁盘块由 四 部分组成。

66. 将/home/stud1/wang目录做归档压缩,压缩后生成wang.tar.gz文件,并将此文件保存到/home目录下,实现此任务的tar命令格式 tar zcvf /home/wang.tar.gz /home/stud1/wang 。

67. 管道就是将前一个命令的 标准输出 作为后一个命令的 标准输入 。

68. 在使用手工的方法配置网络时,可通过修改 /etc/HOSTNAME 文件来改变主机名,若要配置该计算机的域名解析客户端,需配置 /etc/resolv.conf文件。

69. 启动进程有手动启动和调度启动两种方法,其中调度启动常用的命令为 at 、batch 和 crontab 。

70. test.bns.com.cn的域名是 bns.com.cn ,如果要配置一域名服务器,应在 named.conf 文件中定义DNS数据库的工作目录。

71. Sendmail邮件系统使用的两个主要协议是: SMTP 和 POP ,前者用来发送邮件,后者用来接收邮件。

72. DHCP是动态主机配置协议的简称,其作用是:为网络中的主机分配IP地址 。

73. 目前代理服务器使用的软件包有很多种,教材中使用的是 squid 。

74. rm命令可删除文件或目录,其主要差别就是是否使用递归开关 -r或-R 。

75. mv 命令可以移动文件和目录,还可以为文件和目录重新命名。

76. 路由选择协议(RIP)的跳数表示到达目的地之前必须通过的 网关 数,RIP接受的最长距离是 15跳 。

77. ping命令用于测试网络的连通性,ping命令通过 ICMP 协议来实现。

78. nfs 协议用于实现Unix(/linux)主机之间的文件系统共享。

79. 在Linux操作系统中,设备都是通过特殊的 文件 来访问。

80. shell不仅是 用户命令的解释器 ,它同时也是一种功能强大的编程语言。 bash是Linux的缺省shell。

81. 用 >;>; 符号将输出重定向内容附加在原文的后面。

82. 增加一个用户的命令是:adduser 或useradd 。

83 进行字符串查找,使用grep命令。

84. 使用 * 每次匹配若干个字符。

85. /sbin 目录用来存放系统管理员使用的管理程序。

转自:http://codefine.co/精选85条linux系统管理员知识点/

unison + inotify双向同步

介绍篇:

Unison是一款跨windows/linux/MAC OS平台的文件同步工具,不仅支持本地对本地同步,也支持通过SSH、RSH和Socket等网络协议进行同步。Inotify可以监控文件系统操作,比如读取、写入和创建等,通过和Unison配合可以做到将数据实时的进行同步。

Unison双向同步基本原理是:假如有A B两个文件夹,A文件夹把自己的改动同步到B,B文件夹也把自己的改动同步到A,最后A B两文件夹的内容相同,是AB文件夹的合集。

Unison双向同步的一个缺点是:对于一个文件在两个同步文件夹中都被修改时,unison是不会去同步的,因为unison无法判断以那个为准。

如果检测到两个文件夹有所不同,unison会提示,让你选择相应的操作。

 

安装篇:

下载ocaml组件并安装: 

wget http://caml.inria.fr/pub/distrib/ocaml-4.02/ocaml-4.02.1.tar.gz

下载unison :

wget http://www.seas.upenn.edu/~bcpierce/unison//download/releases/beta/unison-2.48.1.tar.gz

下载inotify:

wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

安装ocaml组件:

tar zxvf ocaml-4.02.1.tar.gz;cd ocaml-4.02.1;./configure;make world opt && make install

安装unison程序:

tar zxvf unison-2.48.1.tar.gz;cd unison-2.48.1;make UISTYLE=text
make install

(make UISTYLE=text 报错时,需要创建/root/bin/文件夹后再运行make install。mkdir /root/bin/;make install;cp unison /root/bin/;cp unison /usr/local/bin/

报etags错误可以忽略或者安装etags:yum -y install ctags-etags)

编译好的unsion可拷贝到客户端服务器的/usr/local/bin/下使用

安装inotify:

tar zxvf inotify-tools-3.14.tar.gz; cd inotify-tools-3.14;./configure ; make && make install

使用篇:

首次运行一次unison使其生成配置文件,命令为:/usr/local/bin/unison

使用脚本实现双向同步:

服务端:配置文件以及脚本信息

[root@mysql-test tmp]# cat /root/.unison/default.prf

# Unison preferences file

batch = true

owner = true

group = true

perms = -1

#fastcheck = false

fastcheck = true

rsync = false

sshargs = -C

xferbycopying = true

confirmbigdel = false

log = true

logfile = /var/log/unison.log

maxthreads = 300

#repeat = 1

retry = 3

#ignore = Path /tmp/www.91town.xxx/log/

[root@mysql-test tmp]# cat /tmp/watch.sh

#!/bin/bash

host1=192.168.0.231

host2=192.168.0.225

host3=192.168.0.232

src=/tmp/www.91town.xxx/

#inotifywait -mrq –timefmt ‘%d/%m/%y %H:%M’ –format ‘%T %w%f%e ‘ -e close_write,delete,create,attrib $src |while read files

inotifywait -mrq -e close_write,delete,create,attrib $src |while read files

do

#/usr/local/bin/unison $src ssh://$host1/$src

/usr/local/bin/unison $src ssh://$host2/$src

#/usr/local/bin/unison $src ssh://$host3/$src

echo “$files” >> /tmp/sh.unison.log

echo `date | cut -d ” ” -f1-4` >> /tmp/inotify.log

done

 

客户端:配置文件以及脚本信息

[root@vm4 tmp]# cat /root/.unison/default.prf

# Unison preferences file

root = /tmp/www.91town.xxx #本地文件夹

root = ssh://root@192.168.0.230//tmp/www.91town.xxx #远程文件夹

batch = true #表示全自动模式,接受并执行默认动作。

owner = true #表示保持同步的文件属主信息。

group = true #表示保持同步的文件属组信息。

perms = -1 #表示保持同步的文件读写权限。

#fastcheck = false

fastcheck = true #true表示同步时通过文件的创建时间来比较两地文件;false表示同步时通过比较两地文件内容。

rsync = false #默认值是true,用于激活rsync传输模式。

sshargs = -C #使用ssh的压缩传输方式。

xferbycopying = true #优化传输参数,默认值为true。

confirmbigdel = false #默认值为true,表示当需要同步的两个目录有一个为空时,unison将停止。设置为false可以保证当需要同步的某个目录为空时,unison不会停止运转。

log = true #表示在终端输出运行信息。

logfile = /var/log/unison.log #指定同时输出写入log文件。

maxthreads = 300 #指定同步时最大线程数。

#repeat = 1 #表示间隔1秒后开始一次新的同步检查

#retry = 3 #指定失败重试次数

#path = www

#同步指定的子目录及文件,而非整个目录。可以写多个path,如在下面再写一个path = wwwbak。

#ignore = Path WEB-INF/tmp

#忽略/wwwroot下面的WEB-INF/tmp目录,即同步时不同步它。注意,这里是”Path”,而不是”path”。

 

[root@vm4 tmp]# cat /tmp/watch.sh

#!/bin/bash

src=/tmp/www.91town.xxx/

#inotifywait -mrq –timefmt ‘%d/%m/%y %H:%M’ –format ‘%T %w%f%e ‘ -e close_write,delete,create,attrib $src |while read files

inotifywait -mrq -e close_write,delete,create,attrib $src |while read files

do

unison

echo “$files” >> /tmp/sh.unison.log

echo `date | cut -d ” ” -f1-4` >> /tmp/inotify.log

done

 

转自http://team.91town.com/2014/12/unison-inotify双向同步/

sed命令

  • sed命令行格式
sed [-nefri] command 输入文本
  •  常用选项
-n  使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的资料 一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e  直接在指令列模式上进行 sed 的动作编辑;
-f  filename  直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的 sed 动作;
-r  sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i  直接修改读取的档案内容,而不是由屏幕输出。
  •  常用命令
a  新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的 下一行)~
c  取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d  删除, 因为是删除所以 d 后面通常不接任何字符串;
i  插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p  列印, 亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s  替换, 可以直接进行替换操作,通常这个 s 的动作可以搭配 正规表达式,例如 1,20s/old/new/g
  •  举例
假设文件名为ab
删除某行
$ sed '1d' ab #删除第一行
$ sed '$d' ab #删除最后一行
$ sed '1,2d' ab #删除第一行到第二行
$ sed '2,$d' ab #删除第二行到最后一行

显示某行
$ sed -n '1p' ab #显示第一行
$ sed -n '$p' ab #显示最后一行
$ sed -n '1,2p' ab #显示第一行到第二行
$ sed -n '2,$p' ab #显示第二行到最后一行

使用模式进行查询
$ sed -n '/ruby/p' ab #查询包括关键字ruby所在所有行
$ sed -n '/\$/p' ab #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义

增加一行或多行字符串
$ cat ab
Hello!
ruby is me,welcome to my blog.
end
$ sed '1a drink tea' ab #第一行后增加字符串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
end
$ sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
drink tea
end
drink tea
$ sed '1a drink tea\nor coffee' ab #第一行后增加多行,使用换行符\n
Hello!
drink tea
or coffee
ruby is me,welcome to my blog.
end

代替一行或多行
$ sed '1c Hi' ab #第一行代替为Hi
Hi
ruby is me,welcome to my blog.
end
$ sed '1,2c Hi' ab #第一行到第二行代替为Hi
Hi
end

替换一行中的某部分
格式: sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式)
$ sed -n '/ruby/p' ab | sed 's/ruby/bird/g' #替换ruby为bird
$ sed -n '/ruby/p' ab | sed 's/ruby//g' #删除ruby

插入
$ sed -i '$a bye' ab #在文件ab中最后一行直接输入"bye"
$ cat ab
Hello!
ruby is me,welcome to my blog.
end
bye

 


    Sed单行命令参考(节选自http://sed.sourceforge.net/sed1line_zh-CN.html)

# 在每一行后面增加一空行
 sed G

# 在每5行后增加一空白行 (在第5,10,15,20,等行后增加一空白行)
 gsed '0~5G'                      # 只对GNU sed有效
 sed 'n;n;n;n;G;'                 # 其他sed

# 将原来的所有空行删除并在每一行后面增加一空行。
# 这样在输出的文本中每一行后面将有且只有一空行。
 sed '/^$/d;G'

# 在每一行后面增加两行空行
 sed 'G;G'

# 将第一个脚本所产生的所有空行删除(即删除所有偶数行)
 sed 'n;d'

# 在匹配式样“regex”的行之前插入一空行
 sed '/regex/{x;p;x;}'

# 在匹配式样“regex”的行之后插入一空行
 sed '/regex/G'

# 在匹配式样“regex”的行之前和之后各插入一空行
 sed '/regex/{x;p;x;G;}'

# 计算行数 (模拟 "wc -l")
 sed -n '$='

# 将每一行前导的“空白字符”(空格,制表符)删除;使之左对齐
 sed 's/^[ \t]*//' 

# 将每一行拖尾的“空白字符”(空格,制表符)删除
 sed 's/[ \t]*$//'  

# 将每一行中的前导和拖尾的空白字符删除
 sed 's/^[ \t]*//;s/[ \t]*$//'

# 在每一行开头处插入5个空格(使全文向右移动5个字符的位置)
 sed 's/^/     /'

# 在每一行中查找字串“foo”,并将找到的“foo”替换为“bar”
 sed 's/foo/bar/'                 # 只替换每一行中的第一个“foo”字串
 sed 's/foo/bar/4'                # 只替换每一行中的第四个“foo”字串
 sed 's/foo/bar/g'                # 将每一行中的所有“foo”都换成“bar”
 sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替换倒数第二个“foo”
 sed 's/\(.*\)foo/\1bar/'            # 替换最后一个“foo”

# 只在行中出现字串“baz”的情况下将“foo”替换成“bar”
 sed '/baz/s/foo/bar/g'

# 将“foo”替换成“bar”,并且只在行中未出现字串“baz”的情况下替换
 sed '/baz/!s/foo/bar/g'

# 不管是“scarlet”“ruby”还是“puce”,一律换成“red”
 sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g'  #对多数的sed都有效
 gsed 's/scarlet\|ruby\|puce/red/g'               # 只对GNU sed有效

# 将每两行连接成一行(类似“paste”)
 sed '$!N;s/\n/ /'

# 如果当前行以反斜杠“\”结束,则将下一行并到当前行末尾,并去掉原来行尾的反斜杠
 sed -e :a -e '/\\$/N; s/\\\n//; ta'

选择性地显示特定行:
--------

 # 显示文件中的前10行 (模拟“head”的行为)
 sed 10q

 # 显示文件中的第一行 (模拟“head -1”命令)
 sed q

 # 显示文件中的最后10行 (模拟“tail”)
 sed -e :a -e '$q;N;11,$D;ba'

 # 显示文件中的最后2行(模拟“tail -2”命令)
 sed '$!N;$!D'

 # 显示文件中的最后一行(模拟“tail -1”)
 sed '$!d'                        # 方法1
 sed -n '$p'                      # 方法2

 # 显示文件中的倒数第二行
 sed -e '$!{h;d;}' -e x              # 当文件中只有一行时,输入空行
 sed -e '1{$q;}' -e '$!{h;d;}' -e x  # 当文件中只有一行时,显示该行
 sed -e '1{$d;}' -e '$!{h;d;}' -e x  # 当文件中只有一行时,不输出

 # 只显示匹配正则表达式的行(模拟“grep”)
 sed -n '/regexp/p'               # 方法1
 sed '/regexp/!d'                 # 方法2

 # 只显示“不”匹配正则表达式的行(模拟“grep -v”)
 sed -n '/regexp/!p'              # 方法1,与前面的命令相对应
 sed '/regexp/d'                  # 方法2,类似的语法

 # 查找“regexp”并将匹配行的上一行显示出来,但并不显示匹配行
 sed -n '/regexp/{g;1!p;};h'

 # 查找“regexp”并将匹配行的下一行显示出来,但并不显示匹配行
 sed -n '/regexp/{n;p;}'

 # 显示包含“regexp”的行及其前后行,并在第一行之前加上“regexp”所
 # 在行的行号 (类似“grep -A1 -B1”)
 sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h

 # 显示包含“AAA”、“BBB”或“CCC”的行(任意次序)
 sed '/AAA/!d; /BBB/!d; /CCC/!d'  # 字串的次序不影响结果

 # 显示包含“AAA”、“BBB”和“CCC”的行(固定次序)
 sed '/AAA.*BBB.*CCC/!d'

 # 显示包含“AAA”“BBB”或“CCC”的行 (模拟“egrep”)
 sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d    # 多数sed
 gsed '/AAA\|BBB\|CCC/!d'                        # 对GNU sed有效

 # 显示包含“AAA”的段落 (段落间以空行分隔)
 # HHsed v1.5 必须在“x;”后加入“G;”,接下来的3个脚本都是这样
 sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'

 # 显示包含“AAA”“BBB”和“CCC”三个字串的段落 (任意次序)
 sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'

 # 显示包含“AAA”、“BBB”、“CCC”三者中任一字串的段落 (任意次序)
 sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
 gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d'         # 只对GNU sed有效

 # 显示包含65个或以上字符的行
 sed -n '/^.\{65\}/p'

 # 显示包含65个以下字符的行
 sed -n '/^.\{65\}/!p'            # 方法1,与上面的脚本相对应
 sed '/^.\{65\}/d'                # 方法2,更简便一点的方法

 # 显示部分文本——从包含正则表达式的行开始到最后一行结束
 sed -n '/regexp/,$p'

 # 显示部分文本——指定行号范围(从第8至第12行,含8和12行)
 sed -n '8,12p'                   # 方法1
 sed '8,12!d'                     # 方法2

 # 显示第52行
 sed -n '52p'                     # 方法1
 sed '52!d'                       # 方法2
 sed '52q;d'                      # 方法3, 处理大文件时更有效率

 # 从第3行开始,每7行显示一次    
 gsed -n '3~7p'                   # 只对GNU sed有效
 sed -n '3,${p;n;n;n;n;n;n;}'     # 其他sed

 # 显示两个正则表达式之间的文本(包含)
 sed -n '/Iowa/,/Montana/p'       # 区分大小写方式

选择性地删除特定行:
--------

 # 显示通篇文档,除了两个正则表达式之间的内容
 sed '/Iowa/,/Montana/d'

 # 删除文件中相邻的重复行(模拟“uniq”)
 # 只保留重复行中的第一行,其他行删除
 sed '$!N; /^\(.*\)\n\1$/!P; D'

 # 删除文件中的重复行,不管有无相邻。注意hold space所能支持的缓存
 # 大小,或者使用GNU sed。
 sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'

 # 删除除重复行外的所有行(模拟“uniq -d”)
 sed '$!N; s/^\(.*\)\n\1$/\1/; t; D'

 # 删除文件中开头的10行
 sed '1,10d'

 # 删除文件中的最后一行
 sed '$d'

 # 删除文件中的最后两行
 sed 'N;$!P;$!D;$d'

 # 删除文件中的最后10行
 sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # 方法1
 sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # 方法2

 # 删除8的倍数行
 gsed '0~8d'                           # 只对GNU sed有效
 sed 'n;n;n;n;n;n;n;d;'                # 其他sed

 # 删除匹配式样的行
 sed '/pattern/d'                      # 删除含pattern的行。当然pattern
                                       # 可以换成任何有效的正则表达式

 # 删除文件中的所有空行(与“grep '.' ”效果相同)
 sed '/^$/d'                           # 方法1
 sed '/./!d'                           # 方法2

 # 只保留多个相邻空行的第一行。并且删除文件顶部和尾部的空行。
 # (模拟“cat -s”)
 sed '/./,/^$/!d'        #方法1,删除文件顶部的空行,允许尾部保留一空行
 sed '/^$/N;/\n$/D'      #方法2,允许顶部保留一空行,尾部不留空行

 # 只保留多个相邻空行的前两行。
 sed '/^$/N;/\n$/N;//D'

 # 删除文件顶部的所有空行
 sed '/./,$!d'

 # 删除文件尾部的所有空行
 sed -e :a -e '/^\n*$/{$d;N;ba' -e '}'  # 对所有sed有效
 sed -e :a -e '/^\n*$/N;/\n$/ba'        # 同上,但只对 gsed 3.02.*有效

 # 删除每个段落的最后一行
 sed -n '/^$/{p;h;};/./{x;/./p;}'

  参考:http://test001.readthedocs.org/zh_CN/latest/sed.html         http://sed.sourceforge.net/sed1line_zh-CN.html

tr命令

  • 语法
tr (选项) (参数)
  • 选项
-c或——complerment:取代所有不属于第一字符集的字符;
-d或——delete:删除所有属于第一字符集的字符;
-s或--squeeze-repeats:把连续重复的字符以单独一个字符表示;
-t或--truncate-set1:先删除第一字符集较第二字符集多出的字符。
  • 参数

字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”; 字符集2:指定要转换成的目标字符集。

  • 实例

将输入字符由大写转换为小写。’A-Z’ 和 ‘a-z’都是集合,集合是可以自己制定的,例如:’ABD-}’、’bB.,’、’a-de-h’、’a-c0-9’都属于集合,集合里可以使用’\n’、’\t’,可以可以使用其他ASCII字符。 

# echo "HELLO WORLD" | tr 'A-Z' 'a-z' 
hello world

使用tr删除字符:
# echo "hello 123 world 456" | tr -d '0-9'
hello world 

将制表符转换为空格:
# cat text | tr '\t' ' '

字符集补集,从输入文本中将不在补集中的所有字符删除。此例中,补集中包含了数字0~9、空格和换行符\n,所以没有被删除,其他字符全部被删除了。

# echo aa.,a 1 b#$bb 2 c*/cc 3 ddd 4 | tr -d -c '0-9 \n' 
1 2 3 4

用tr压缩字符,可以压缩输入中重复的字符:
# echo "thissss is a text linnnnnnne." | tr -s ' sn' 
this is a text line.

使用tr做数字相加操作:
# echo 1 2 3 4 5 6 7 8 9 | xargs -n1 | echo $[ $(tr '\n' '+') 0 ]
45

删除Windows文件“造成”的'^M'字符:
# cat file | tr -s "\r" "\n" > new_file
或
# cat file | tr -d "\r" > new_file
tr可以使用的字符类

[:alnum:]:字母和数字 [:alpha:]:字母 [:cntrl:]:控制(非打印)字符 [:digit:]:数字 [:graph:]:图形字符 [:lower:]:小写字母 [:print:]:可打印字符 [:punct:]:标点符号 [:space:]:空白字符 [:upper:]:大写字母 [:xdigit:]:十六进制字符

使用方式

# tr '[:lower:]' '[:upper:]'
  转自:http://man.linuxde.net/tr

Linux的Split命令

用法:split [选项]... [输入 [前缀]]
将输入内容拆分为固定大小的分片并输出到"前缀aa"、"前缀ab",...;
默认以 1000 行为拆分单位,默认前缀为"x"。如果不指定文件,或
者文件为"-",则从标准输入读取数据。

长选项必须用的参数在使用短选项时也是必需的。
  -a, --suffix-length=N	指定后缀长度为N (默认为2)
  -b, --bytes=大小		指定每个输出文件的字节大小
  -C, --line-bytes=大小	指定每个输出文件里最大行字节大小
  -d, --numeric-suffixes 	使用数字后缀代替字母后缀
  -l, --lines=数值		指定每个输出文件有多少行
      --verbose		在每个输出文件打开前输出文件特征
      --help     显示此帮助信息并退出
      --version  输出版本信息并退出

SIZE 可以是一个可选的整数,后面跟着以下单位中的一个:
KB 1000,K 1024,MB 1000*1000,M 1024*1024,还有 G、T、P、E、Z、Y。

 

常用操作

1.将文件每200行分割

split -200 access.log 或split -l 200 access.log

操作之后产生xaa,xab,xac三个文件

2. 指定文件名,并以数字作为后缀

split -l200 -a3 -d access.log access.split

将产生三个文件 access.split000,access.split001,access.split002

3.指定文件大小以20M进行分割

split -b20m access.log

4.指定文件大小以20M,还保证维持每行的完整性进行分割

split -C20m access.log

5.文件的合并,将以上分割的文件合并

cat access.split*>access.log.old

不管用什么方式切割,合并方法不变

6. 指定文件名,指定文件大小,并以数字作为后缀

split -b20m -a3 -d access.log access.split

 

 

转自:http://www.lampblog.net/2011/06/split命令-对文件进行分割/

 

有关云架构建设和选型的思考

最近在负责公司内部私有云的建设,一直在思考怎么搞云计算,怎么才能够把云架构设计得好一些。本文尽量全面的列出了云架构建设和选型的考量因素。

我们主要从五个层面逐步评估云架构的建设和选型,分别是:

  1. 行业生态
  2. 企业需求
  3. 云计算的能力
  4. 潜在的挑战
  5. 如何建设

一、行业生态

计算机云经过多年的发展,由一开始的概念,慢慢发展成熟并能够推向市场,提供多种多样的服务,市场空间非常之大。

在云的发展过程中,亚马逊经过多年的深耕积累,发展成为了云行业的标杆企业,甚至可以说是建立了云解决方案的标准。之后,Google、IBM、思科、Oracle、HP、Intel、华为等IT巨头先后参与进来,在软件和硬件方面提供专门的面向企业的解决方案,纷纷打着云计算、大数据、智能等概念来吸引客户,拓展市场。

另外一方面,基于大数据、存储、云服务等,市场上也先后出现一些创新企业,如Dropbox、Rackspace,国内的七牛、青云、UnitedStack等。

当前的IT世界有一个常见的现象,就是只要某一个领域有一套成熟的商业软件,就同时也会有一套开源的解决方案,如Windows之于Linux,Google的MapReduce、GFS、大表之于Hadoop等。在云领域也存在相应的开源解决方案,目前最为著名的有Openstack和Cloudstack。开源行业的领导者RedHat此前

在企业操作系统的市场已经做的很好,RHEL的各个版本在企业级系统市场有相当高的市场份额。现在的RedHat特别重视云的发展,并将云操作系统作为未来10年的发展战略重点,在最近两年先后收购了Gluster以及Ceph等存储企业,以壮大自己在云领域的影响力。

随着云领域的发展,市场上也逐渐形成了面向企业提供硬件和软件产品的提供商、面向企业提供服务的提供商、面向市场初创企业提供基础服务的提供商、面向个人提供业务服务的提供商等一系列行业生态。0813002

二、企业需求

需求是什么,也就是what people need这个问题。我们所说的people,即人或者公司实体,该对象的划分并不单纯,可粗浅的从三个角度来进行分类:

从企业角度看:

1)小型企业

小型企业的技术储备不多,人员缺乏,没有独立的IT部门,但是在构建自己的IT系统过程中需要购置各种产品和服务,包括服务器、网络、CDN等等,而要完成这样的工作,需要投入大量的人力和财力。通过购买云服务可以更加方便快捷,简单的完成系统的搭建。

2)中型企业

中型企业有一定的规模,需要在信息化、管理方面有所注重,一般内部都设立IT部门,但是和小型企业一样,IT部门大多数都是为了解决自身需求,很难能够有一个完整的解决方案。这样在服务器、网络、CDN、企业管理软件等等的需求还是比较大的。

3)大型企业

大型企业人数规模在万人以上,特别是高新企业,都有一个实力不错的IT支撑部门,通过部门就可以完善对企业内部信息化建设。

从企业性质范围来看:

1)传统行业企业

传统行业大多数是以服务业、制造业、生产性企业为主,在IT信息化方面相对比较落后,属于重资产行业。

2)互联网企业

互联网行业是基于IT作为解决方案的

3)IT服务企业

以销售软件、硬件、以及技术咨询服务为主的企业。

针对市场中存在的企业、个体等的需求特点,市场上一般对软件服务进行如下分类:

  1. 提供软件的服务,解决企业内部信息化问题,如ERP系统、进销存管理系统、人力资源管理系统、行政系统、财务系统等等。(SaaS)
  2. 提供平台服务,解决行业共性问题,将SaaS迁移到云端,提供平台类的服务。如淘宝的开放平台、Facebook的开放平台、基于Salesforce的销售系统、云笔记、云盘等。(PaaS)
  3. 提供基础设施服务。基础设施包括软件和硬件方面的,包括存储、虚拟机、网络、防火墙、缓存、负载均衡、数据库等等。(IaaS)

从企业内部人员角色来看:

企业内部,尤其是互联网企业内部,一般将角色分为如下几类:

  1. 开发
  2. 测试
  3. 运维
  4. DBA
  5. 产品
  6. 项目管理人员
  7. 客服
  8. 业务人员(销售、市场、BD、人力资源、行政等等)

不同的角色对于软件服务的需求也是不同的,下图大致描绘了互联网行业各个角色对云平台的需求:

0813003

三、云计算的能力

云计算能够解决什么,也就是what cloud offer这个问题。目前的云计算在应用中主要提供了以下八个能力:

  1. 封装:将计算能力和软件放在云端,可以减少重复建设,将通用的服务封装起来,达到重用,减少资源的浪费,提高生产效率,并提供成熟的解决方案。在云端,云提供商可以建立软件的标准,提供发布包的方式,用户可以通过软件包的方式进行购买使用,譬如目前开源领域的Docker。
  2. 安全:云计算将数据和存储,软件逻辑都集中于云端,更能方便的统一构建安全体系,通过Iptables实现网络过滤,并在服务端做安全组件实现安全策略,并能够通过海量集群应对DDOS攻击等。
  3. 灵活:云计算提供灵活的软件和服务端架构,用户不再需要自己构建应用运行环境,对资源的使用能够按需购买,并能够升级,并自由组合。举例来说:用户可以选用不同的存储方式(mysql、oracle,文件系统,kv等等)
  4. 性能:通过集群的能力和云端的集成能够提高集群的性能处理,通过专业的云解决提供商,在云端的性能扩展更加方便,技术上更加专业。譬如服务端可以在用户毫不察觉的情况下完成添加机器、存储扩容等操作。
  5. 伸缩能力:在存储和计算能力方面提供弹性的资源管理,能够按需使用,在使用过程中,可以通过动态的添加和减少物理资源,来提高响应能力或节约成本。
  6. 运维:云计算在IaaS角度来看,重要的是运维,能够将运维更加集中化管理,并完全智能化,大大降低人力成本
  7. 充分利用物理资源:通过云建设,能够将物理资源进行虚拟化处理,屏蔽物理硬件底层,并能够完成物理资源软化进行逻辑管理和分配调度
  8. 大数据:大数据保存于云端,能够提供数据分析和智能处理

当然,云计算还有很多很多好处,给我们带来很多想像空间和IT技术的革命。

公有云与私有云

行业内将云分为“公有云”和“私有云”。在我们之前的需求分析过程中,大致了解了云的需求,“公有云”和“私有云”的差别最大的是需求的差异,因为需求的差异,导致了技术方案和产品决策的差异。

公有云需求上由于用户多种多样,导致需求存在不一样,特别需要更多的定制化,譬如:

  1. 存储个性化云存储方面大概分为块存储和对象存储,块存储适合于vm运行环境,对象存储提供了KV的访问方式提供了海量扩展存储文件的能力,用户可以根据自己的需求选择不同的存储方式,选用不同的容量。在存储物理介质方面来说,因为存在不同的物理介质,对性能和安全的要求,可以采用传统的SATA硬盘,或者SSD存储等。
  2. 内存使用内存方面,需要提供动态扩展内存的方式,用户能够自由扩展
  3. 网络的定制化公有云用户需要能够构建自己的内部网络,并能够自动组网
  4. 数据库使用公有云的用户分属不同的公司团体,各自的技术差异存在,因而有不同的数据库类型,譬如mysql,sqlserver,oracle等等。并能够定义存储大小,内存运行大小等等。并提供数据备份、恢复、高可用服务等
  5. 缓存使用公有云的用户可以选择不同的缓存方式,譬如增加CDN,采用不同的KV缓存方式并选择容量。
  6. 安全问题公有云对于云的安全和私有云差别较大,私有云大多数在安全问题上不需要公有云那么严格,大多数是内部系统之间的交互

以上仅限于IaaS层面的考虑,当然对于公有云来说还有很多细化的个性化需求,例如:数据分析,业务对接服务等等。

四、潜在的挑战

计算机自从诞生以来,一直按照冯.诺伊曼的体系发展在硬件的基础上的操作系统,也分为网络协议体系的实现、内存管理、文件管理体系等等。大致的抽象图如下:

0813004

要建设云,有几个重要的问题需要解决:

  1. 管理问题云计算的实施首先要解决运维的问题,在云环境下后端是大规模数量的物理节点的集群,对于同时维护数以千计算的计算节点,以及部署结构的复杂,需求的变化,光靠增加人力也难以解决复杂的问题。从而需要构建高效的计算资源管理系统,能够灵活简单的管理运系统,并能够及时的发现问题。
  2. 计费问题(公有云)对于公有云而言,因为是面向公众的,必然产生费用的问题,常用的收费方式多种多样,也因为产品的不同而计费方式不同,譬如:网络、存储、cpu、数据库容量等等
  3. 资源隔离问题云计算运行在云端,是通过虚拟化体系建立的,虚拟化是建立在硬件之上,多个虚拟化资源同时运行于同一节点(host)中,存在着资源的共享争用问题,

    这样就存在着资源使用的公平性问题,导致同一Host上的资源使用相互影响。为了使得彼此资源使用相互独立,我们要建立相应的隔离机制。资源的隔离包括:存储、内存、cpu、数据库、网络等,其中网络是最难控制的。

  4. 安全问题在云端的应用和基于客户端的安全,面临的环境不一样,客户端方面大多数是病毒问题引起的,而在云端,也存在一些服务器攻击的问题,以及数据相互独立相互影响的问题,以及一些服务端编程的安全问题等。
  5. 性能问题对于云来说,需要保证云端的性能问题,包括CPU处理性能,IO处理能力,资源的就近访问,资源数据同步的速度,还需要解决系统底层的性能问题,包括文件处理Cache,存储介质的优化,采用SSD等,或者采用SATA+SSD的混合方式节约资源和降低成本。
  6. 存储问题对于云来说,由于云端是将客户端的数据和运算转移到云端,必须要有足够的存储能力以及足够稳定的存储系统,保证用户数据的安全,对于存储来说,有提供VM虚拟机运行环境的block device(块存储),以及提供KV方式的对象访问存储,这些都需要保证数据复制、数据读写访问的性能和数据永久可用的能力
  7. 网络问题对于公有云以及私有云的一些应用场景,需要能够提供网络的逻辑隔离(SDN)或物理隔离,以及对网络的访问灵活问题。构建虚拟化网络,由于物理条件的限制,我们不得不从L2-L4层进行处理,我们常用的方式是:bridge,vlan,gre,sdn(openflow,opendaylight),以及一些厂家的产品等等。
  8. 高可用问题高可用问题是在分布式系统中必须要处理的问题,正因为集群的问题,我们必须要从多方面考虑解决的问题,包括保证云管理系统的高可用性,存储介质的高可用性,网络的高可用性,虚拟机高可用问题等等。
  9. 提高资源利用率问题对于物理资源的虚拟化,我们有很多种解决方法,KVM、Vmware、xen、Hyperv、LXC等等,在HVM的方式下,对于VM本身的启动需要占用大量的内存、cpu和存储资源,导致系统内存和cpu使用有一定的浪费,基于LXC的解决方案因为是机基于Host OS进程,通过namespace的方式进行隔离的,是一种轻量级的实现,能够在资源初始化,资源利用率方面能够最大化,对于各个应用场景来说,我们可以选用合适的解决方案。

五、如何建设

58同城经过多年的发展,探索了一条适合自身发展的技术架构体系。随着业务和技术的发展,团队规模不断壮大,在技术和管理上面临越来越多的挑战。在项目需求管理,开发效率、代码管理和质量建设,测试,线上发布,运维管理等方面需要有一套完整的解决方案,来提升公司的协作能力和整体能效。

58同城目前所有的应用在线上都是跑在物理机器上,采用物理机的方式,一方面会导致服务器资源得不到充分和合理的使用,譬如:有些物理机器cpu使用长期在10%以下,有些内存使用剩余很多;另外一方面,由于互联网的特点,存在着时段内的访问高峰问题,需要解决资源使用的伸缩问题;基于以上问题,架构部对现有的技术体系进行梳理和分析,采用资源虚拟化的方式进行私有云的建设,并在这基础上,完善公司整体技术体系,包括:开发、测试、上线、运维等一系列自动化和智能化方面的建设。

私有云的目标

  1. 提高物理资源的利用率
  2. 一套云管理系统,降低运维的复杂度,提高运维工作效率
  3. 构建灵活的开发、测试集成环境
  4. 提供海量的存储体系
  5. 建立完善的监控体系
  6. 建立基础应用环境、方便测试
  7. 统一架构
  8. 智能资源调度

实施方案:OpenStack

对于云计算来说,也存在着多种解决方案,如CloudStack和OpenStack等。在两种方案的比较之后,我们最终选择了OpenStack的解决方案。主要是出于以下几点原因:

  1. OpenStack的社区成熟度:OpenStack经过几年的发展,社区已经越来越成熟,很多大公司都参与进来帮助完善,红帽公司未来十年也将OpenStack作为发展的战略重点。
  2. 架构设计的选择:OpenStack采用了Python语言编写,并且设计上采用组件化的方式,各个组件独立发展,并相互解耦
  3. OpenStack提供了更加完整成熟的方案,能够满足多样的需求,同时已经有不少公司采用,已经经过生产上的验证
  4. 文档问题:OpenStack文档化做的不错,网上能够找到多种多样的问题处理办法
  5. 人员招聘问题,经过多年的发展和市场的培育,了解OpenStack的人越来越多,对于开发维护的人才建设和招聘相对成熟一些。
  6. 发展比较迅速

下图是我们大致的架构规划

0813005

文章观点仅一家之言,欢迎大家一起交流探讨。我计划在下一篇文章《58同城私有云建设实践》中详细介绍我们私有云建设的思路和过程,中间遇到的问题,希望跟大家一起探讨。

转自: http://www.infoq.com/cn/articles/cloud-structure-thinking

理解inode

inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础。

我觉得,理解inode,不仅有助于提高系统操作水平,还有助于体会Unix设计哲学,即如何把底层的复杂性抽象成一个简单概念,从而大大简化用户接口。

下面就是我的inode学习笔记,尽量保持简单。

===================================

理解inode

作者:阮一峰

一、inode是什么?

理解inode,要从文件储存说起。

文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。

文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。

每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

二、inode的内容

inode包含文件的元信息,具体来说有以下内容:

* 文件的字节数
* 文件拥有者的User ID
* 文件的Group ID
* 文件的读、写、执行权限
* 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
* 链接数,即有多少文件名指向这个inode
* 文件数据block的位置

可以用stat命令,查看某个文件的inode信息:

stat example.txt

1

总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,下文会有详细解释。

三、inode的大小

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。

df -i

2

查看每个inode节点的大小,可以用如下命令:

dumpe2fs -h /dev/hda | grep "Inode size"

3

由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。

四、inode号码

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。

表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

使用ls -i命令,可以看到文件名对应的inode号码:

ls -i example.txt

4

五、目录文件

Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。

目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。

ls命令只列出目录文件中的所有文件名:

ls /etc

5

ls -i命令列出整个目录文件,即文件名和inode号码:

ls -i /etc

6

如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的详细信息。

ls -l /etc

7

理解了上面这些知识,就能理解目录的权限。目录文件的读权限(r)和写权限(w),都是针对目录文件本身。由于目录文件内只有文件名和inode号码,所以如果只有读权限,只能获取文件名,无法获取其他信息,因为其他信息都储存在inode节点中,而读取inode节点内的信息需要目录文件的执行权限(x)。

六、硬链接

一般情况下,文件名和inode号码是”一一对应”关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。

这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为”硬链接”(hard link)。

ln命令可以创建硬链接:

ln 源文件 目标文件

8

运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做”链接数”,记录指向该inode的文件名总数,这时就会增加1。

反过来,删除一个文件名,就会使得inode节点中的”链接数”减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

这里顺便说一下目录文件的”链接数”。创建目录时,默认会生成两个目录项:”.”和”..”。前者的inode号码就是当前目录的inode号码,等同于当前目录的”硬链接”;后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的”硬链接”。所以,任何一个目录的”硬链接”总数,总是等于2加上它的子目录总数(含隐藏目录)。

七、软链接

除了硬链接以外,还有一种特殊情况。

文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的”软链接”(soft link)或者”符号链接(symbolic link)。

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:”No such file or directory”。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode”链接数”不会因此发生变化。

ln -s命令可以创建软链接。

ln -s 源文文件或目录 目标文件或目录

9

八、inode的特殊作用

由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。

  1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。

  2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。

  3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。

第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。

(完)

转自:http://www.ruanyifeng.com/blog/2011/12/inode.html

 

 

 

linux下使用inode删除乱码或无法识别文件

说明:
linux下有时候某些文件无法使用rm直接删除, 比如该文件的文件名含有终端不能正确显示的字符。这时就可以通过inode来删除

具体:
1. 查看文件innode

# ls -li
total 0
441511 -rw-r--r-- 1 root root 0 Apr 6 23:13 ???}????

 

2. 删除文件,如果该文件夹下没有别的文件. 可以直接rm -rf *删除。但如果有别的不想删除的. 就只能通过 inode 删除了
# find . -inum 441511 -delete
或
# rm -i `find . -maxdepth 1 -inum 45656 -print`

 

转自:http://coolnull.com/3176.html