一、一切皆文件
linux下“一切皆文件”,不仅数据被组织成文件形式,连各种设备资源也被抽象成了文件形式,而对文件只有read、write、open、close几种操作,这样便统一了用户对各种资源的访问方式,简化了操作。
二、文件类型
普通文件(-,f)、目录文件(d)、符号链接文件(l)、设备文件( 字符设备c,块设备b)、命名管道(p)、套接字文件(s)
查看文件类型:file /path/to/somefile...,可同时查看多个文件的类型,中间用空格相隔
以下当我们将文件和目录并称时,一般指狭义上的“文件”
三 、如何指定一个文件或目录
linux使用层次化结构表示文件路径,一个目录就是一个名称空间,同一目录下文件不能同名。指定一个文件或目录有绝对路径和相对路径两种方式:
绝对路径:从顶级名称空间(即根)起始标记的路径,例如/home/tesla/test
每个绝对路径由基名(由命令basename获悉)和目录名(由dirname获悉)组成,以/home/tesla/test为例,其基名为test,目录名为/home/tesla
相对路径:相对于当前目录而言的路径,例如../test
几种独特的路径表示:
.:当前目录
..:上一级目录
-:前一个工作目录
~:当前使用者的家目录
四、与目录相关的操作
1、cd:切换至指定目录
用法:cd DirName
cd ~username:切换至指定用户的家目录
2、pwd:以绝对路径的方式打印当前工作目录
3、mkdir:创建目录
用法:mkdir [option]... DIR...(多同时创建多个目录,用空格隔开)
常用选项:
-p:一次创建多个层次目录,如mkdir /temp/a/b/
-m:创建目录的同时设置目录的权限,如mkdir -m 740 /temp/a
4、rmdir:删除指定的空目录
用法:rmdir [option]... DIR...
常用选项:
-p:删除指定目录及其上级目录
注意:要删除的目录必须为空,使用-p选项一次删除多个层级空目录,直至不空的目录为止。例如rmdir -p /temp/a/b/c,若目录b,c为空,a不空,则会删除b,c,保留a
5、tree:以树状图显示目录层级结构,该程序需额外安装
常用选项:
-d:显示目录名称而非内容
-L #:只显示#层目录
-a:显示所有目录和文件
[root@localhost ~]# tree -d /lib64 /lib64 ├── dbus-1 ├── device-mapper ├── rsyslog ├── rtkaio ├── security │ ├── pam_filter │ └── pam_krb5 ├── tls └── xtables 9 directories
五、文件与目录管理
查看文件内容:
1)cat:连接并显示文本文件内容
用法:cat [option]... FILE...,可同时显示多个文本文件,以空格隔开
常用选项:
-n:显示行号
-E:显示行结束符
2)tac:逆序显示文本文件内容
3)nl:添加行号打印文本文件内容
4)head:用于显示文件的开头的内容。在默认情况下显示文件的头10行内容。
常用选项:
-n [-]#:显示前#行内容,若有加-则显示除最后#行外的其他内容
如head -n 3 /etc/inittab /etc/passwd
5)tail:类似于head,只是tail是显示文件尾部的内容
常用选项:
-n [+]#:显示最后#行内容,如果有+则从文件开头的第#项开始显示
-f:使tail一直显示尾部,因此有实时监视的效果,ctrl+c退出
6)less和more:这两个命令均用于分屏显示文本文件内容,不同的是less命令允许向前或向后浏览,而more命令只能向前浏览。用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页。退出按q键。在用less或more查看文本文件内容时,也可搜索字串,方法同vim字串搜索
查看文件或目录状态信息:
stat:用于显示文件或目录的状态信息,包括文件大小,块数,inode号,权限,时间戳等,比ls命令更详细
用法:stat [option]... FILE...
时间戳Access、Modify、Change的含义:
Access:文件最后一次被访问的时间
Modify:文件内容最后一次被修改的时间,例如被vim编辑过后该时间会更新
Change:文件状态最后一次改变的时间,例如移动,修改权限、属主、属组等均会引起该值改变
通常modify操作也会引起Access和Change更新
[tesla@localhost ~]$ stat test/init File: `test/init' Size: 884 Blocks: 8 IO Block: 4096 regular file Device: 802h/2050d Inode: 131172 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 501/ tesla) Gid: ( 501/ tesla) Access: 2015-10-01 09:18:06.768163964 +0800 Modify: 2015-10-01 09:18:06.768163964 +0800 Change: 2015-10-01 09:18:39.550391159 +0800 [tesla@localhost ~]$ vim test/init [tesla@localhost ~]$ stat test/init File: `test/init' Size: 824 Blocks: 8 IO Block: 4096 regular file Device: 802h/2050d Inode: 145404 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 501/ tesla) Gid: ( 501/ tesla) Access: 2015-10-01 09:19:42.763840959 +0800 Modify: 2015-10-01 09:19:42.763840959 +0800 Change: 2015-10-01 09:19:42.764840957 +0800 [tesla@localhost ~]$
复制文件或目录:
cp: 用来将一个或多个源文件或者目录复制到指定的目的文件或目录
用法:cp [option]... SRC... DEST
常用选项:
-a:相当于-dpr,实际上是存档
-d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录
-f:强行覆盖
-i:交互式操作,复制前询问
--preserve=[ATTR_LIST]:指定保留原文件或目录的哪些属性,ATTR_LIST为mode,ownership,timestamps
-p:保留原文件或目录的属性,相当于--preserve=mode,ownership,timestamps
-P:复制符号链接本身
-r/R:递归复制目录及其子目录内的所有内容
关于cp命令的几点说明:
1)SRC是文件,如果DEST不存在,复制SRC为DEST;如果DEST存在:1、如果DEST是文件,则覆盖 2、如果DEST是目录,将SRV复制进DEST中,并保持原名
2)如果SRC不止一个,则DEST必须是目录
3)cp默认情况下不复制目录,若要复制目录,可使用选项-r
4)复制后的新文件属主默认为执行该操作的用户,可使用--preserve或-p选项保留原属性
5)如果复制的是一个符号链接文件,则会将该链接文件所指向的文件复制,且保留符号链接的名字。如果想复制符号链接文件本身,可使用选项-P
移动和删除:
1)mv:将源文件(或目录)重命名为目标文件,或将源文件移动至指定目录。
用法:mv [option]... SRC... DEST
常用选项:
-b:当目标文件存在时,覆盖前,为其创建一个备份
-i:移动前询问
-f:强制覆盖,覆盖前不询问
-u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作
若源文件有多个,则目标文件必须是目录
2)rm:删除文件或目录
用法:rm [option]... FILE...
常用选项:
-i:删除前询问
-f:强制删除,删除前不询问
-r/R:递归处理,将指定目录下的所有文件与子目录一并处理
rm默认不删除目录,使用-r选项可删除目录及其下所有内容
[tesla@localhost ~]$ cp /etc/{rc.local,inittab} test [tesla@localhost ~]$ cp /etc/rc.local ./ [tesla@localhost ~]$ mv -b rc.local test/ [tesla@localhost ~]$ ls test inittab rc.local rc.local~ [tesla@localhost ~]$ rm -irv test rm: descend into directory `test'? y rm: remove regular file `test/rc.local~'? y removed `test/rc.local~' rm: remove regular file `test/inittab'? y removed `test/inittab' rm: remove regular file `test/rc.local'? y removed `test/rc.local' rm: remove directory `test'? y removed directory: `test'
创建文件:
除了可以通过复制现有文件或使用编辑器(如vim))直接编辑生成新文件之外,还可以通过touch命令创建一个空文件
touch命令有两个功能:一是创建新的空文件;二是将已存在文件的访问时间和修改时间更新为系统当前的时间,而它们的数据不变
用法:touch [option]... FILE...
常用选项:
-a:只更改访问时间
-d,--date=字符串:使用指定字符串表示时间替代当前时间
-m:只更新修改时间
-t:使用[[CC]YY]MMDDhhmm[.ss] 格式的时间替代当前时间
-r,--reference=file:使用指定文件的时间属性替代当前时间
tesla@localhost ~]$ ls test/ init [tesla@localhost ~]$ touch test/terminate [tesla@localhost ~]$ touch -mt 10010830 test/terminate [tesla@localhost ~]$ stat test/terminate File: `test/terminate' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 802h/2050d Inode: 145388 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 501/ tesla) Gid: ( 501/ tesla) Access: 2015-10-01 10:05:22.332344736 +0800 Modify: 2015-10-01 08:30:00.000000000 +0800 Change: 2015-10-01 10:05:33.662422730 +0800
其它文本文件处理工具
1)wc:统计指定文件中的字节数、单词数、行数, 并显示出来
用法:wc [option]... FILE...
常用选项:
-c:只显示字节数
-l:只显示行数
-w:只显示单词数
2)cut:该命令有两个功能,一是在文件中的每一行提取指定片断,并显示在标准输出上,二是连接两个或多个文件,如cut file1 file2 > file3,将file1和file2的内容合并再输出至file3中
用法:cut [option]... FILE...
常用选项:
-b:仅显示行中指定范围的字节
-c:仅显示行中指定范围的字符
-d:指定分隔符(默认为制表符),例如要指定空格为分隔符可写为-d ' '
-f:指定要显示的字段(以列为单位),如-f1,5表示第1、第5字段,-f1-5表示第1到第5之间的字段,-f与-d结合使用
[tesla@localhost ~]$ wc /etc/passwd /etc/inittab 33 51 1590 /etc/passwd 26 149 884 /etc/inittab 59 200 2474 total [tesla@localhost ~]$ cut -d: -f1 /etc/passwd /etc/inittab > /tmp/initpas [tesla@localhost ~]$ head -n 3 /tmp/initpas root bin daemon [tesla@localhost ~]$ wc -l /tmp/initpas 59 /tmp/initpas
3)sort:将文件内容进行排序。以行为单位,从首字符开始,依次按ASCII码值进行比较,最后将按升序输出,注意,sort并不实际改变文件内容
用法:sort [option]... FILE...
常用选项:
-f:忽略字符大小写
-t:指定分隔符后要进行排序的字段
-n:指明以数值大小进行排序,sort默认是以字符来排序的
-u:排序后去重(注意:相同且相邻的行才算重复)
-r:降序输出结果
-o:将排序后的结果写入到文件,而非标准输出
[tesla@localhost ~]$ cat /tmp/sortest distribute:80 describe:5 attribute:35 literature:100 Alter:11 attribute:35 consist:20 [tesla@localhost ~]$ sort /tmp/sortest Alter:11 attribute:35 attribute:35 consist:20 describe:5 distribute:80 literature:100 [tesla@localhost ~]$ sort -u -t : -k 2 /tmp/sortest literature:100 Alter:11 consist:20 attribute:35 describe:5 distribute:80 [tesla@localhost ~]$ sort -u -t : -k 2 -n /tmp/sortest describe:5 Alter:11 consist:20 attribute:35 distribute:80 literature:100 [tesla@localhost ~]$ sort -u -t : -k 2 -n /tmp/sortest -o /tmp/sortest [tesla@localhost ~]$ cat /tmp/sortest describe:5 Alter:11 consist:20 attribute:35 distribute:80 literature:100
4)uniq:去重后显示文件内容
用法:uniq [option]... FILE...
常用选项:
-c:在每行旁边显示该行出现的次数
-d:仅显示重复出现的行
-u:仅显示出没有重复的行
[root@localhost ~]# cat /tmp/sortest describe:5 Alter:11 consist:20 consist:20 attribute:35 Alter:11 [root@localhost ~]# uniq -c /tmp/sortest 1 describe:5 1 Alter:11 2 consist:20 1 attribute:35 1 Alter:11
修改文件或目录属性:
1)修改文件权限,见博客http://9124573.blog.51cto.com/9114573/1698033
2)chown:修改文件或目录的属主和属组,指定属主和属组使用名称或ID均可
用法:chown [-R] [--reference=somefile] user[:group或.group] file...
常用选项:
--reference=somefile:参照指定文件的属主属组设定目标文件的属主属组
-R:递归处理
示例:chown -R tesla /tmp/test
chown tesla:science /tmp/elec #将elec的属主和属组分别修改为tesla和science
chown :science /tmp/elec #作用等同于chgrp science /tmp/elec
chown --reference=/tmp/future /tmp/past
3)chgrp:修改文件或目录的属组
用法同chown类似,不再赘述
注意:只有root用户才能修改文件属主和属组
4)chattr:给文件或目录设置隐藏属性
用法:chattr [+|-] [特殊属性] FILE...
+:表示增加特殊属性
-:表示移除特殊属性
常用特殊属性:
A:访问文件后,其atime不会改变。由此减少了频繁I/O对性能的损耗
a:设置a之后,该文件(或目录)将只能增加内容,不能删除或更改原有内容,只有root用户能够设置该属性
i:该属性使文件(或目录)不能被删除、更名、写入、设定链接,只有root用户能够设置
s:如果文件被删,将会被完全从磁盘上移除,无法恢复
u:如果文件被删,其内容仍保存于磁盘上,可以恢复
5)lsattr:显示文件的隐藏属性
用法:lsattr [option]... FILE...
选项:
-a:将隐藏文件的特殊属性也显示出来
-d:仅显示目录自身的特殊属性
-R:递归处理,边同目录下所有文件和子目录一并显示
[root@localhost tesla]# lsattr test/* -----a-------e- test/inittab -------------e- test/passwd [root@localhost tesla]# rm -f test/inittab rm: cannot remove `test/inittab': Operation not permitted [root@localhost tesla]# echo "hello" > test/inittab -bash: test/inittab: Operation not permitted [root@localhost tesla]# echo "hello" >> test/inittab [root@localhost tesla]# echo $? 0 [root@localhost tesla]# chattr +a test [root@localhost tesla]# lsattr -d test -----a-------e- test [root@localhost tesla]# cp /etc/rc.local test/ [root@localhost tesla]# ls test inittab passwd rc.local [root@localhost tesla]# rm -f test/passwd rm: cannot remove `test/passwd': Operation not permitted
命令和文件的查找:
1)which:通过遍历PATH环境变量所保存的目录用于查找并显示给定命令的绝对路径
用法:which [选项] [参数]
常用选项:
-a:查找全部内容,而非第一个文件,因which默认是搜索到第一个目标文件后就停止
[root@localhost tesla]# which ls find alias ls='ls --color=auto' /bin/ls /bin/find
2)whereis:用来定位二进制程序、源代码文件和man手册页等相关文件的路径
用法:whereis [选项]... [参数]...
常用选项:
-b:只查找二进制文件
-m:只定位帮助文件
-s:只定位源代码文件
[root@localhost tesla]# whereis ssh ftp ssh: /usr/bin/ssh /etc/ssh /usr/share/man/man1/ssh.1.gz ftp: /usr/bin/ftp /usr/share/man/man1/ftp.1.gz
3)locate:查找文件或目录,非实时非精确查找,速度快。不搜索具体目录,而是根据索引(/var/lib/mlocate/mlocate.db)查找,该索引由系统创建并在系统空闲时自动更新,也可手动使用updatedb命令更新。索引构建很占资源。
例:locate -i /etc/rc #搜索/etc目录下所有以rc开头的文件,忽略字符大小写
4)find:查找文件或目录,实时精确查找,速度慢,因为要遍历所有文件进行条件匹配
用法:find [option]... [查找路径] [查找条件] [处理动作]
查找路径 :默认为当前目录
查找条件:默认为指定路径下的所有文件
-name "文件名":支持使用通配符
-iname"文件名":查找时忽略字符大小写
-user USERNAME:根据文件属主查找
-group GROUPNAME
-uid UID:删除某用户后,原来属主为该用户的文件其属主会变成该用户的ID号,因此可使用-uid作为查找条件找到这些文件
-gid GID
-nouser:查找没有属主的文件
-nogroup
-type TYPE:根据文件类型查找
-size [+|-]#UNIT:根据文件大小查找 ,常用单位有K,M,G
#UNIT:#-1<x<=#
-#UNIT:x<=#-1
+#UNIT:x>#
-atime [+|-]#:根据时间戳查找,以“天”为单位,另外,还有mtime,ctime。amin/mtime/ctime表示以“分钟”为单位
#:#<=x<#+1
-#:x<#
+#:x>=#+1
-perm [+|-]MODE:根据权限查找
MODE:与MODE精确匹配
+MODE:只要能包含指定的任意一类用户的任意一位权限即可,例如权限为-w--w--w-的文件符合条件-perm -446
-MODE:为每类用户指定的每一位权限都要能够被包含
组合条件查找:
-a:与。例,find /etc -iname "p*" -a -user root 查找etc目录下以p开头且属主为root的文件
-o:或
!/-not:非。例,find /tmp -not \( -iname "*r*" -o -user gentoo \) 查找tmp目录下文件名不包含r且属主不为gentoo的文件
处理动作:默认显示至屏幕
-print:显示
-ls:类似于ls -l
-exec COMMAND {} \; # {}代表由find找到的内容;-exec到\;是关键字,代表处理动作的开始与结束
-ok COMMAND {} \; 相当于交互式exec
find一次性查找符合条件的所有文件,并一同传递给-exec或-ok后面指定的命令,但有些命令无法接受过长的参数,此时可使用find 条件 | xargs COMMAND(xargs:把其他命令给它的数据传递给它后面的命令作为参数),例如find /tmp -iname "*test*" | xargs rm -f
六、find使用示例
1、查找/var目录属主为root,且属组为mail的所有文件;
[root@localhost ~]# find /var -user root -a -group mail /var/spool/mail
2、查找/usr目录下不属于root、bin和hadoop的所有文件;
[root@localhost ~]# find /usr ! \( -user root -o -user bin -o -user hadoop \) /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
3、查找/etc目录下最近一周内其内容修改过,且属主不为root、hadoop的所有文件;
[root@localhost ~]# find /etc -mtime -7 -a ! \( -user root -o -user hadoop \) [root@localhost ~]#
4、查找当前系统上没有属主或属组,且最近一周内曾被访问过的所有文件;
[root@localhost ~]# find / -atime -7 -a \( -nouser -o -nogroup \) find: `/proc/9323/task/9323/fd/5': No such file or directory find: `/proc/9323/task/9323/fdinfo/5': No such file or directory find: `/proc/9323/fd/5': No such file or directory find: `/proc/9323/fdinfo/5': No such file or directory
5、查找/etc目录下大于20k且类型为普通文件的所有文件;
[root@localhost ~]# find /etc -size +20k -a -type f /etc/prelink.cache /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-bundle.trust.crt ...
6、查找/etc目录下所有用户都没有写权限的文件;
[root@localhost ~]# find /etc ! -perm +222 -ls 133044 4 -r--r--r-- 1 root root 146 Aug 17 2013 /etc/pam.d/cups 131339 308 -r--r--r-- 1 root root 314336 Aug 6 04:52 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt 131342 184 -r--r--r-- 1 root root 185023 Aug 6 04:52 /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem 131340 228 -r--r--r-- 1 root root 232342 Aug 6 04:52 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem 131341 184 -r--r--r-- 1 root root 185220 Aug 6 04:52 /etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem 131343 172 -r--r--r-- 1 root root 172980 Aug 6 04:52 /etc/pki/ca-trust/extracted/java/cacerts 133042 4 -r--r--r-- 1 root root 460 Aug 17 2013 /etc/dbus-1/system.d/cups.conf 145410 4 ---------- 1 root root 1177 Oct 1 23:55 /etc/shadow 145406 4 ---------- 1 root root 675 Oct 1 23:55 /etc/gshadow 131109 4 ---------- 1 root root 1148 Oct 1 20:46 /etc/shadow- 144046 4 -r--r----- 1 root root 4002 Mar 2 2012 /etc/sudoers 142606 4 -r-xr-xr-x 1 root root 2134 Nov 24 2013 /etc/rc.d/init.d/lvm2-lvmetad 142607 4 -r-xr-xr-x 1 root root 2665 Nov 24 2013 /etc/rc.d/init.d/lvm2-monitor 142605 4 -r-xr-xr-x 1 root root 1340 Nov 24 2013 /etc/rc.d/init.d/blk-availability 131101 4 ---------- 1 root root 664 Oct 1 20:46 /etc/gshadow- 138423 4 -r--r--r-- 1 root root 324 Nov 22 2013 /etc/ld.so.conf.d/kernel-2.6.32-431.el6.x86_64.conf
7、查找/etc目录下至少有一类用户没有执行权限的文件;
[root@localhost ~]# find /etc ! -perm -111 -ls ... 131115 628 -rw-r--r-- 1 root root 641020 Oct 2 2013 /etc/services 140932 4 -rw-r--r-- 1 root root 1117 Nov 12 2010 /etc/pcmcia/config.opts 131094 4 -rw-r--r-- 1 root root 1512 Jan 12 2010 /etc/aliases ...
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户拥有写权限的文件;
[root@localhost ~]# find /etc/init.d -perm -113 /etc/init.d