linux中(chattr)创建不可修改文件的方法

在常见的linux扩展文件系统中(如ext2、ext3、ext4等),可以将文件设置为不可修改(immutable)。某些文件属性可帮助我们将文件设置不可修改。一旦文件被设置为不可修改,任何用户包括超级用户都不能删除该文件,除非其不可修改的属性被移除。
通过查看/etc/mtab文件,很容易找出所有挂载分区的文件系统类型。这个文件的第一列指定了分区设备路径(如/dev/sda5),第三列指定了文件系统类型(如ext3)。

接下来让我们看看如何将文件设置为不可修改吧。

可以用chattr将文件设置为不可修改。
不过chattr能够更改的扩展属性可不止这些。
不可修改属性是保护文件不被修改的安全手段之一。最有代表性的例子就是 /etc/shadow文件。该文件由当前系统中所有用户的加密密码组成。我们通过密码才能登录系统。用户通常用passwd命令修改自己的密码。执行passwd时,它实际上就修改了 /etc/shadow文件。我们可以将shadow文件设置为不可修改,这样就再没有用户能够修改密码了。

让我们来看看具体是如何实现的。

可以按照下面的方式将一个文件设置为不可修改:
chattr +i file
或者:
$ sudo chattr +i file
这样文件file就变为了不可修改。
来试试下面的这条命令:
rm file
rm: cannot remove `file`: Operation not permitted

如果需要使文件重新可写,移除其不可修改的属性即可:
chattr -i file

touch命令

touch命令改变文件的时间信息。
参数:
-a : 仅修改access time。
-c : 仅修改时间,而不建立文件。
-m : 仅修改mtime。
-r : 参照某个文件的时间记录。
-t : 后面可以接时间,格式为 [[CC]YY]MMDDhhmm[.SS] 如198408250310.20

如果不指定任何选项,则把文件最近使用时间和最近变更时间改成系统当前时间。如果不存在指定的文件,就生成一个大小为0的空文件。

#ll file1             --无文件
file1 not found
#touch file1          --生成一个空文件
#ll file1             --大小为0,时间为系统当前时间
-rw-r--r--   1 root  sys  0 Nov  9 17:10 file1

#date                 --过了1分钟,系统时间发生变化
Wed Nov  9 17:11:01 MST 2011
#touch file1          --变更文件的时间记录

#ll file1             --文件的时间改为当前时间
-rw-r--r--   1 root  sys  0 Nov  9 17:11 file1
#touch -t 09100111 file1      --MMDDhhmm,9月10日1点11分
#ll file1
-rw-r--r--   1 root  sys   0 Sep 10 01:11 file1

#touch file2
#ll file1 file2            --新生成file2文件
-rw-r--r--   1 root  sys   0 Sep 10 01:11 file1
-rw-r--r--   1 root  sys   0 Nov  9 17:15 file2
#touch -r file1 file2      --参照file1的时间记录,改写file2的时间信息
#ll file1 file2
-rw-r--r--   1 root  sys   0 Sep 10 01:11 file1
-rw-r--r--   1 root  sys   0 Sep 10 01:11 file2


diff命令

这又是一个文件比较命令,熟练掌握会节省你很多工作。还记得comm命令吗?diff比他更加复杂,好用,不仅能比较文件,还能比较目录。 当一个文件有多个版本时候,或者更多复杂的文件,目录比较时,你会期望有一个比comm更有用的命令,diff正是为此而生。 

全称:different file 

实例:

文件1: v1.txt



hello
 world v1_echo 
 v1_diff
 v1_comm 
shell is easy!


文件2: v2.txt


hello world! 
v2_echo
 v1_diff
easy shell!



1.普通比较:

  1. $diff v1.txt v2.txt  


1,2c1,2 
< hello world 
< v1_echo 
--- 
> hello world! 
> v2_echo 
4c4 
< v1_comm 
--- 
> easy shell!


列出比较的区别,数字为行数,c是compare

2.一体化输出:

  1. $diff -u v1.txt v2.txt &gt; version.patch 


-v1_echo 
+hello world! 
+v2_echo 
v1_diff 
-v1_comm 
+easy shell! 
shell is easy!


"+"表示补充的行,"-"表示删去的行

3. 更新覆盖v1.txt,注意这里借用了patch

  1. $patch –p1 v1.txt&lt; version.patch 

4. 比较v1,v2文件,仅输出v2的变化

  1. $diff -e v1.txt v2.txt 

 


4c 
easy shell! 
. 
1,2c 
hello world! 
v2_echo 
.


 

5.比较目录

借用书上一段解释:

-N 将所有确实的文件视为空文件

-a 将所有文件市委文件文本

-u 生成一体化输出

-r 遍历目录下的所有文件 

比较两个目录下所有文本信息

1. $diff –Naur directory1 directory2

除非你确定这两个目录基本相同,不然不推荐这么用。


6.工作疲劳后,尤其同时做很多事情的时候,会忘了有没有做过上传,或者修改某个目录下的文件。可以这样:

1. $diff v1.txt /${dir}

直接比较同名文件,高强度下的工作者相信真有体会。 


文本操作命令-wc


全称

wc是一个用于统计的工具,全拼为:Word Count(单词统计) 

实例:

1. 统计行数

1. $wc –l file

2. 统计单词数

1. $wc –w file

3. 统计字符数

1. $wc –c file

4. 统计流中的字符数

1. $echo –n 1234 | wc –c

输出:4 

解读--help

用法:wc [选项]... [文件]... 

或:wc [选项]... --files0-from=F 

打印每行的换行符,单词,字节的数量,如果多于一个文件,则打印每个总行数。如果没有文件,或者文件位置用“-”表示,则读取标准流。 一个单词是由空白符分隔的非零长的字符序列 

     下面的操作可能用于选择某种类型数量的打印,通常顺序是 换行符,单词,字符,字节,最大行的长度 

-c, --bytes                   打印字节数

-m, --chars                  打印字符数

-l,   --lines                    打印换行符,即总行数

--files0-from=文件      从指定文件读取以NUL 终止的名称,如果该文件被 

指定为"-"则从标准输入读文件名 

-L, --max-line-length    显示最长行的长度 

-w, --words                 显示单词计数 

                           --help 显示此帮助信息并退出 

                            --version 显示版本信息并退出

解读:

1. 多于一个文件

$wc file1  file2

打印两个文件的分别的统计行数

2. –L

打印最长的行数的字符数,即长度

3. 直接wc 文件,无任何参数

顺序是 行数,单词,字符,字节,最大行长度