比较常用的一个命令,即查看一个文件的内容并显示在屏幕上, 后面可以不加任何选项直接跟文件名,两个常用的选项:
-n : 查看文件时,把行号也显示到屏幕上。
[root@localhost ~]# echo '111111111' > dirb/filee
[root@localhost ~]# echo '222222222' >> dirb/filee
[root@localhost ~]# cat dirb/filee
111111111
222222222
[root@localhost ~]# cat -n dirb/filee
1 111111111
2 222222222
上例中出现了一个 ‘>>’ 这个符号跟前面介绍的 ‘>’ 的作用都是重定向,即把前面输出的东西输入到后边的文件中,只是 ‘>>’ 是追加的意思,而用 ‘>’ 如果文件中有内容则会删除文件中内容,而 ‘>>’ 则不会。
-A : 显示所有东西出来,包括特殊字符
[root@localhost ~]# cat -A dirb/filee
111111111$
222222222$
命令: tac
和 ‘cat’ 一样,用来把文件的内容显示在屏幕上,只不过是先显示最后一行,然后是倒数第二行,最后显示的是第一行。
[root@localhost ~]# tac dirb/filee 222222222 111111111
命令: more
也是用来查看一个文件的内容,后面直接跟文件名,当文件内容太多,一屏幕不能占下,而你用 ‘cat’ 肯定是看不前面的内容的,那么使用 ‘more’ 就可以解决这个问题了。当看完一屏后按空格键继续看下一屏。但看完所有内容后就会退出。如果你想提前退出,只需按 ‘q’ 键即可。
命令: less
作用跟more一样,后面直接跟文件名,但比more好在可以上翻,下翻。空格键同样可以翻页,而按 ‘j’ 键可以向下移动(按一下就向下移动一行),按 ‘k’ 键向上移动。在使用more和less查看某个文件时,你可以按一下 ‘/’ 键,然后输入一个word回车,这样就可以查找这个word了。如果是多个该word可以按 ‘n’ 键显示下一个。另外你也可以不按 ‘/’ 而是按 ‘?’ 后边同样跟word来搜索这个word,唯一不同的是, ‘/’ 是在当前行向下搜索,而 ‘?’ 是在当前行向上搜索。
命令: head
‘head’后直接跟文件名,则显示文件的前十行。如果加 -n 选项则显示文件前n行。
[root@localhost ~]# head /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@localhost ~]# head -n 1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# head -n2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
‘-n’后可以有空格也可以无空格。
命令: tail
和head一样,后面直接跟文件名,则显示文件最后十行。如果加-n 选项则显示文件最后n行。
[root@localhost ~]# head -n2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost ~]# tail /etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:76:'Saslauthd user':/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
[root@localhost ~]# tail -n2 /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
-f : 动态显示文件的最后十行,如果文件是不断增加的,则用-f 选项。如:tail -f /var/log/messages
该选项特别特别常用,请熟记。
文件的所属主以及所属组
这时 ‘所属组’ 就派上用场了。即,创建一个群组users,让user0和user1同属于users组,然后建立一个文件test2,且其所属组为users,那么user0和user1都可以访问test2文件。Linux文件属性不仅规定了所属主和所属组,还规定了所属主(user)、所属组(group)以及其他用户(others)对该文件的权限。你可以通过ls -l 来查看这些属性。
[root@localhost ~]# ls -l
总用量 40
-rw-------. 1 root root 980 5月 7 18:00 anaconda-ks.cfg
drwxr-xr-x. 3 root root 4096 5月 10 05:10 dirb
linux文件属性
上例中,用ls 杔 查看当前目录下的文件时,共显示了9列内容(用空格划分列),都代表了什么含义呢?
第1列,包含的东西有该文件类型和所属主、所属组以及其他用户对该文件的权限。第一列共11位有的文件是10位,没有最后面的一位。 其中第一位用来描述该文件的类型。上例中,我们看到的类型有 ‘d’, ‘-‘ ,其实除了这两种外还有 ‘l’, ‘b’, ‘c’, ‘s’ 等。
‘d’ 表示该文件为目录;
‘-‘ 表示该文件为普通文件;
‘l’ 表示该文件为链接文件(linux file),上边提到的软链接即为该类型;
[root@localhost ~]# ls -l /etc/rc.local
lrwxrwxrwx. 1 root root 13 5月 7 17:54 /etc/rc.local -> rc.d/rc.local
上例中,第一列第一位是 ‘l’ 表示该文件为链接文件,稍后详细介绍。
‘b’ 表示该文件为块设备,比如 /dev/sda 就是这样的文件。
‘c’ 表示该文件为串行端口设备,例如键盘、鼠标。
‘s’ 表示该文件为套接字文件(socket),用于进程间通信。
后边的9位,每三个为一组。均为rwx 三个参数的组合。其中r 代表可读,w代表可写,x代表可执行。前三位为所属主(user)的权限,中间三位为所属组(group)的权限,最后三位为其他非本群组(others)的权限。下面拿一个具体的例子来述说一下。
一个文件的属性为 ‘-rwxr-xr–.’ ,它代表的意思是,该文件为普通文件,文件拥有者可读可写可执行,文件所属组对其可读不可写可执行,其他用户对其只可读。对于一个目录来讲,打开这个目录即为执行这个目录,所以任何一个目录必须要有x权限才能打开并查看该目录。例如一个目录的属性为 ‘drwxr–r–.’ 其所属主为root,那么除了root外的其他用户是不能打开这个目录的。
关于第一列的最后一位的 .
,要说一下,之前的CentOS 5 是没有这个点的,这主要是因为新版本的ls把selinux或者acl的属性加进来了,当文件或者目录只使用了selinux context的属性,这里是一个点。如果设置了acl,后面将是一个加号 ‘+’. 关于selinux 和 acl 不再详细介绍,你只要了解是怎么回事即可,如果你感兴趣可以网上搜索相关知识也可以通过在本章后面提供的扩展学习链接进行学习。
第2列,表示为链接占用的节点(inode), 为目录时,通常与该目录底下还有多少目录有关系。
第3列,表示该文件的所属主。
第4列,表示该文件的所属组。
第5列,表示该文件的大小。
第6列、第7列和第8列为该文件的最近的修改日期,分别为月份日期以及时间,也就是所谓的mtime.
第9列,文件名。
更改文件的权限
- 更改所属组 chgrp
语法:chgrp [组名] [文件名]
[root@localhost ~]# groupadd testgroup
[root@localhost ~]# touch test1
[root@localhost ~]# ls -l test1
-rw-r--r-- 1 root root 0 5月 10 08:41 test1
[root@localhost ~]# chgrp testgroup test1
[root@localhost ~]# ls -l test1
-rw-r--r-- 1 root testgroup 0 5月 10 08:41 test1
这里用到了 ‘groupadd’ 命令,其含义为增加一个用户组。该命令在以后章节中做详细介绍,你只要知道它是用来增加用户组的即可。除了更改文件的所属组,还可以更改目录的所属组。
[root@localhost ~]# ls -l dirb/
总用量 8
drwxr-xr-x. 2 root root 4096 5月 10 05:08 dirc
-rw-r--r--. 1 root root 20 5月 10 05:37 filee
[root@localhost ~]# ls -ld dirb/
drwxr-xr-x. 3 root root 4096 5月 10 05:10 dirb/
[root@localhost ~]# chgrp testgroup dirb
[root@localhost ~]# ls -ld dirb/
drwxr-xr-x. 3 root testgroup 4096 5月 10 05:10 dirb/
[root@localhost ~]# ls -l dirb/
总用量 8
drwxr-xr-x. 2 root root 4096 5月 10 05:08 dirc
-rw-r--r--. 1 root root 20 5月 10 05:37 filee
‘chgrp’命令也可以更改目录的所属组,但是只能更改目录本身,而目录下面的目录或者文件没有更改,要想级联更改子目录以及子文件,有个选项可以实现:
[root@localhost ~]# chgrp -R testgroup dirb
[root@localhost ~]# ls -l dirb
总用量 8
drwxr-xr-x. 2 root testgroup 4096 5月 10 05:08 dirc
-rw-r--r--. 1 root testgroup 20 5月 10 05:37 filee
‘chgroup’ 命令使用的不多,因为还有一个命令可以替代。
- 更改文件的所属主 chown
语法: chown [ -R ] 账户名 文件名
chown [-R ] 账户名:组名 文件名
这里的-R选项只作用于目录,作用是级联更改,即不仅更改当前目录,连目录里的目录或者文件全部更改。
[root@localhost ~]# mkdir test // 创建 'test' 目录
[root@localhost ~]# useradd user1 // 创建用户 'user1', 关于 'useradd' 命令会在后续章节介绍。
[root@localhost ~]# touch test/test2 // 在test目录下创建test2文件
[root@localhost ~]# chown user1 test
[root@localhost ~]# ls -l test
总用量 0
-rw-r--r-- 1 root root 0 5月 10 09:00 test2
[root@localhost ~]# ls -ld test // test目录所属主已经由 'root' 改为 'user1'.
drwxr-xr-x 2 user1 root 4096 5月 10 09:00 test
[root@localhost ~]# ls -l test // 但是test目录下的test2文件所属主依旧是 'root'.
总用量 0
-rw-r--r-- 1 root root 0 5月 10 09:00 test2
[root@localhost ~]# chown -R user1:testgroup test
[root@localhost ~]# ls -l test
总用量 0
-rw-r--r-- 1 user1 testgroup 0 5月 10 09:00 test2
chown -R user1:testgroup test //把test目录以及目录下的文件都修改成所属主为user1, 所属组为testgroup.
- 改变用户对文件的读写执行权限 chmod
在linux中为了方便更改这些权限,linux使用数字去代替rwx, 具体规则为 ‘r’ 等于4, ‘w’ 等于2, ‘x’ 等于1, ‘-‘ 等于0. 举个例子: ‘-rwxrwx—’ 用数字表示就是 ‘770’, 具体是这样来的: ‘rwx’ = 4+2+1=7; ‘rwx’ = 4+2+1=7; ‘- – -‘ = 0+0+0=0.
chmod 语法: chmod [-R]
(这里的xyz,表示数字)
xyz 文件名
‘-R’ 选项作用同chown,级联更改。
值得提一下的是,在linux系统中,默认一个目录的权限为 755,而一个文件的默认权限为644.
[root@localhost ~]# ls -ld test
drwxr-xr-x 2 user1 testgroup 4096 5月 10 09:00 test
[root@localhost ~]# ls -l test
总用量 0
-rw-r--r-- 1 user1 testgroup 0 5月 10 09:00 test2
[root@localhost ~]# chmod 750 test
[root@localhost ~]# ls -ld test
drwxr-x--- 2 user1 testgroup 4096 5月 10 09:00 test
[root@localhost ~]# ls -l test/test2
-rw-r--r-- 1 user1 testgroup 0 5月 10 09:00 test/test2
[root@localhost ~]# chmod 700 test/test2
[root@localhost ~]# chmod -R 700 test
[root@localhost ~]# ls -ld test
drwx------ 2 user1 testgroup 4096 5月 10 09:00 test
[root@localhost ~]# ls -l test
总用量 0
-rwx------ 1 user1 testgroup 0 5月 10 09:00 test2
如果你创建了一个目录,而该目录不想让其他人看到内容,则只需设置成 ‘rwxr—–’ (740) 即可。’chmod’ 还支持使用rwx的方式来设置权限。从之前的介绍中我们可以发现,基本上就九个属性分别是(1)user (2)group (3)others, 我们可以使用u, g, o 来代表它们三个的属性,此外, a 则代表 all 亦即全部。举例来介绍他们的用法:
[root@localhost ~]# chmod u=rwx,og=rx test/test2
[root@localhost ~]# ls -l test/test2
-rwxr-xr-x 1 user1 testgroup 0 5月 10 09:00 test/test2
这样可以把 ‘test/test2’ 文件权限修改为 ‘rwxr-xr-x’. 另外还可以针对u, g, o, a增加或者减少某个权限(读,写,执行),例如:
[root@localhost ~]# chmod u-x test/test2
[root@localhost ~]# ls -l test
总用量 0
-rw-r-xr-x 1 user1 testgroup 0 5月 10 09:00 test2
[root@localhost ~]# chmod a-x test/test2
[root@localhost ~]# ls -l test/test2
-rw-r--r-- 1 user1 testgroup 0 5月 10 09:00 test/test2
[root@localhost ~]# chmod u+x test/test2
[root@localhost ~]# ls -l test/test2
-rwxr--r-- 1 user1 testgroup 0 5月 10 09:00 test/test2
命令: umask
上边也提到了默认情况下,目录权限值为755, 普通文件权限值为644, 那么这个值是由谁规定呢?追究其原因就涉及到了 ‘umask’.
umask语法: umask xxx
(这里的xxx代表三个数字)
查看umask值只要输入 ‘umask’ 然后回车。
[root@localhost ~]# umask
0022
umask预设是0022,其代表什么含义?先看一下下面的规则:
1)若用户建立为普通文件,则预设 ‘没有可执行权限’, 只有’rw’两个权限。最大为666 (‘-rw-rw-rw-‘).
2)若用户建立为目录,则预设所有权限均开放,即777 (‘drwxrwxrwx’).
umask数值代表的含义为,上边两条规则中的默认值(文件为666,目录为777)需要减掉的权限。
所以目录的权限为 'rwxrwxrwx' - '----w--w-' ='rwxr-xr-x'
,
普通文件的权限为 'rw-rw-rw-' - '----w--w-' ='rw-r--r--',
umask的值是可以自定义的,比如设定umask 为 002,你再创建目录或者文件时,默认权限分别为
'rwxrwxrwx' - '-------w-' = 'rwxrwxr-x'
和 'rw-rw-rw-' - '-------w-' = 'rw-rw-r--'
.
[root@localhost ~]# umask 002
[root@localhost ~]# mkdir test2
[root@localhost ~]# ls -ld test2
drwxrwxr-x 2 root root 4096 5月 10 09:44 test2
[root@localhost ~]# touch test3
[root@localhost ~]# ls -l test3
-rw-rw-r-- 1 root root 0 5月 10 09:45 test3
可以看到创建的目录权限默认变为775, 而文件默认权限变为664. 然后再把umask改回来。
[root@localhost ~]# umask 022
[root@localhost ~]# touch test4
[root@localhost ~]# ls -l test4
-rw-r--r-- 1 root root 0 5月 10 09:45 test4
umask 可以在 /etc/bashrc
里面更改,预设情况下,root的umask为022,而一般使用者则为002,因为可写的权限非常重要,因此预设会去掉写权限。
- 修改文件的特殊属性
命令 : chattr
语法: chattr [+-=][ASaci [文件或者目录名]
‘+-=’ : 分别为增加、减少、设定
‘A’ : 增加该属性后,文件或目录的atime将不可被修改;
‘S’ : 增加该属性后,会将数据同步写入磁盘中;
‘a’ : 增加该属性后,只能追加不能删除,非root用户不能设定该属性;
‘c’ : 自动压缩该文件,读取时会自动解压;
‘i’ : 增加后,使文件不能被删除、重命名、设定链接接、写入、新增数据;
[root@localhost ~]# chattr +i test2
[root@localhost ~]# touch test2/test1
touch: 无法创建'test2/test1': 权限不够
[root@localhost ~]# chattr -i test2
[root@localhost ~]# touch test2/test1
[root@localhost ~]# chattr +i test2
[root@localhost ~]# rm -f test2/test1
rm: 无法删除'test2/test1': 权限不够
对 ‘test2’ 目录增加 ‘i’ 权限后,即使是root账户也不能在 ‘test2’ 里创建或删除test1文件。
[root@localhost ~]# chattr -i test2
[root@localhost ~]# touch test2/test3
[root@localhost ~]# ls test2
test1 test3
[root@localhost ~]# chattr +a test2
[root@localhost ~]# rm -f test2/test1
rm: 无法删除 'test2/test1': 不允许的操作
[root@localhost ~]# touch test2/test4
[root@localhost ~]# ls test2
test1 test3 test4
test2目录增加 ‘a’ 权限后,只可以在里面创建文件,而不能删除文件。文件同样可以适用这些权限。
[root@localhost ~]# chattr +a test2/test1
[root@localhost ~]# echo '11111' > test2/test1
-bash: test2/test1: 不允许的操作
[root@localhost ~]# echo '11111' >> test2/test1
[root@localhost ~]# cat test2/test1
11111
[root@localhost ~]# chattr +i test2/test3
[root@localhost ~]# echo '11111' >> test2/test3
-bash: test2/test3: 权限不够
[root@localhost ~]# echo '11111' > test2/test3
-bash: test2/test3: 权限不够
[root@localhost ~]# rm -f test2/test3
rm: 无法删除'test2/test3': 权限不够
命令 : lsattr
该命令用来读取文件或者目录的特殊权限,语法为 lsattr [-aR] [文件/目录名]
‘-a’ : 类似与ls 的-a 选项,即连同隐藏文件一同列出;
‘-R’ : 连同子目录的数据一同列出
[root@localhost ~]# lsattr test2
-----a-------e- test2/test1
----i--------e- test2/test3
-------------e- test2/test4
[root@localhost ~]# lsattr -aR test2
----i--------e- test2/.
-----a-------e- test2/test1
-------------e- test2/..
----i--------e- test2/test3
-------------e- test2/test4
在linux下搜一个文件
在windows下有一个搜索工具,可以让我们很快的找到一个文件,这是很有用的。然而在linux下搜索功能更加强大。
- ‘which’ 用来查找可执行文件的绝对路径。
在前面已经用到该命令,需要注意的一点是,which只能用来查找PATH环境变量中出现的路径下的可执行文件。这个命令用的也是蛮多的,有时候我们不知道某个命令的绝对路径,which 一下很容易就知道了。
- ‘whereis’ 通过预先生成的一个文件列表库去查找跟给出的文件名相关的文件。
语法: whereis [-bmsu] [文件名称]
‘-b’ : 只找binary 文件
‘-m’ : 只找在说明文件manual路径下的文件
‘-s’ : 只找source来源文件
‘-u’ : 没有说明档的文件
说明:whereis 几乎很少用到,如果你感兴趣请深入研究。
- ‘locate’ 类似于’whereis’, 也是通过查找预先生成的文件列表库来告诉用户要查找的文件在哪里。
后边直接跟文件名。如果你的linux没有这个命令,请安装软件包 ‘mlocate’, 这个软件包在你的系统安装盘里,后缀名是RPM,随后介绍的find命令会告诉你如何查找这个包。如果你装的CentOS你可以使用这个命令来安装 yum install -y mlocate
前提是你的CentOS能连网。至于yum这个命令如何使用,到后续章节你自然会明白。如果你刚装上这个命令,初次使用会报错。
[root@localhost ~] # locate passwd
locate: can not open `/var/lib/mlocate/mlocate.db': No such file or directory
这是因为系统还没有生成那个文件列表库。你可以使用 updatedb
命令立即生成(更新)这个库。如果你的服务器上正跑着重要的业务,那么你最好不要去运行这个命令,因为一旦运行,服务器的压力会变大。这个数据库默认情况下每周更新一次。所以你用locate命令去搜索一个文件,正好是在两次更新时间段内,那你肯定是得不到结果的。你可以到/etc/updated.conf 去配置这个数据库生成(更新)的规则。’locate’所搜索到的文件列表,不管是目录名还是文件名,只要包含我们要搜索的关键词,都会列出来,所以’locate’不适合精准搜索,这个命令使用的也并不多,你只要明白有这么一个工具即可,用到时再去深究其用法吧。
- ‘find’ 这个搜索工具是用的最多的一个,所以请你务必要熟悉它。
语法 : find [路径] [参数]
下面介绍几个经常用的参数
‘-atime +n/-n’ : 访问或执行时间大于/小于n天的文件
‘-ctime +n/-n’ : 写入、更改inode属性(例如更改所有者、权限或者链接)时间大于/小于n天的文件
‘-mtime +n/-n’ : 写入时间大于/小于n天的文件
[root@localhost ~]# find /tmp/ -mtime -1
/tmp/
/tmp/.ICE-unix
/tmp/test
[root@localhost ~]# find /tmp/ -atime +10
[root@localhost ~]# find /tmp/ -atime +1
/tmp/yum.log
/tmp/.bash_history
看到这里,你对这三个time是不是有些晕了,那就先给你介绍一下这三个time属性。
文件的 Access time也就是 ‘atime’ 是在读取文件或者执行文件时更改的。文件的 Modified time也就是 ‘mtime’ 是在写入文件时随文件内容的更改而更改的。文件的 Create time也就是 ‘ctime’ 是在写入文件、更改所有者、权限或链接设置时随inode的内容更改而更改的。 因此,更改文件的内容即会更改mtime和ctime,但是文件的ctime可能会在 mtime 未发生任何变化时更改,例如,更改了文件的权限,但是文件内容没有变化。 如何获得一个文件的atime mtime 以及ctime ?
‘stat’ 命令可用来列出文件的 atime、ctime 和 mtime。
[root@localhost ~]# stat test/test2
File: 'test/test2'
Size: 0 Blocks: 0 IO Block: 4096 普通空文件
Device: 803h/2051d Inode: 261657 Links: 1
Access: (0744/-rwxr--r--) Uid: ( 500/ user1) Gid: ( 500/testgroup)
Access: 2013-05-10 09:00:36.092000531 +0800
Modify: 2013-05-10 09:00:36.092000531 +0800
Change: 2013-05-10 09:30:58.788996594 +0800
atime不一定在访问文件之后被修改,因为:使用ext3文件系统的时候,如果在mount的时候使用了noatime参数那么就不会更新atime的信息。总之, 這三個 time stamp 都放在 inode 中。若 mtime, atime 修改inode 就一定會改, 既然 inode 改了, 那 ctime 也就跟着要改了。
继续’find’常用选项:
‘-name filename’ 直接查找该文件名的文件,这个选项使用很多。
[root@localhost ~]# find . -name test2
./test/test2
./test2
‘-type filetype’ 通过文件类型查找。文件类型在前面部分已经简单介绍过,相信你已经大体上了解了。filetype 包含了 f, b, c, d, l, s 等。
[root@localhost ~]# find /tmp/ -type d
/tmp/
/tmp/.ICE-unix
/tmp/test
[root@localhost ~]# find /tmp/ -type f
/tmp/yum.log
/tmp/.bash_history
/tmp/ip.txt
暂无评论内容