您的位置:首页 > 运维架构 > Linux

Linux 文件与目录管理

2014-05-19 14:24 197 查看
在linux中什么是一个文件的路径呢,说白了就是这个文件存在的地方,例如/root/.ssh/authorized_keys这就是一个文件的路径。如果你告诉系统这个文件的路径,那么系统就可以找到这个文件。在linux的世界中,存在着绝对路径和相对路径。
绝对路径:路径的写法一定由根目录”/”写起,例如/usr/local/mysql这就是绝对路径。
相对路径:路径的写法不是由根目录”/”写起,例如,首先用户进入到/然后再进入到home,命令为
cd /home然后 cd test此时用户所在的路径为
/home/test 。第一个cd命令后跟
/home 第二个cd命令后跟test,并没有斜杠,这个test是相对于/home目录来讲的,所以叫做相对路径。
pwd这个命令打印出当前所在目录



cd进入到某一个目录



./指的是当前目录
../指的是当前目录的上一级目录。



上图中,首先进入到/usr/local/lib/目录下,然后再进入
./其实还是进入到当前目录下,用pwd查看当前目录,并没有发生变化,然后再进入../则是进入到了/usr/local/目录下,即/usr/local/lib目录的上一级目录。你看明白了吗?
mkdir创建一个目录,这个命令在上一章节中提及过。mkdir其实就是make
directory的缩写。其语法为 mkdir
[-mp] [目录名称],其中-m , –p为其选项,-m:这个参数用来指定要创建目录的权限,该参数不常用,所以笔者不做重点解释。-p:这个参数很管用的,先来做个试验,你会一目了然的。



当我们想创建 /tmp/test/123目录,可是提示不能创建,原因是/tmp/test目录不存在,你会说,这个linux怎么这样傻,/tmp/test目录不存在就自动创建不就OK了嘛,的确linux确实很傻,如果它发现要创建的目录的上一级目录不存在就会报错。然后linux也为我们想好了解决办法,即-p参数。



你看到这里,是不是明白-p参数的作用了?没错,它的作用就是递归创建目录,即使上级目录不存在。还有一种情况就是如果你想要创建的目录存在的话,会提示报错,然后你加上-p参数后,就不会报错了。



rmdir删除一个目录。



rmdir其实是rmove directory缩写,其只有一个选项-p类似与mkdir命令,这个参数的作用是将上级目录一起删除。举个例子吧,新建目录mkdir
-p d1/d2/d3 ,rmdir -p d1/d2/d3相当于是删除了d1,d1/d2,
d1/d2/d3。如果一个目录中还有目录,那么当你直接rmdir该目录时,会提示该目录不为空,不能删除。如果你非要删除不为空的目录,那你用rm指令吧。
rm删除目录或者文件
rmdir只能删除目录但不能删除文件,要想删除一个文件,则要用rm命令了。rm同样也有很多选项。你可以通过
man rm 来获得详细帮助信息。在这里笔者只列举较常用的几个选项。
-f强制的意思,如果不加这个选项,当删除一个不存在的文件时会报错。



-i这个选项的作用是,当用户删除一个文件时会提示用户是否真的删除。



如果删除,输入y否则输入
n
-r当删除目录时,加该选项,如果不加这个选项会报错。rm是可以删除不为空的目录的。



你会发现,笔者在列举的rm例子中使用的是绝对路径,而ls则使用的相对路径。这是为什么呢?



which用来查找一个命令的绝对路径,这个命令笔者不详细介绍,因为平时笔者只用来查找一个命令的绝对路径。
alias用来设置指令的别名。语法:alias[别名]=[指令名称],例如
alias rm='rm -i' ,即当我们使用rm命令时,实际上是使用的是rm
–i ,而用绝对路径的/bin/rm则不会被alias,该命令在以后章节中会详细介绍。
ls在前面的命令中多次用到它。现在你已经明白它的含义了吧。没有错,就是查看某个目录或者某个文件,是list的简写。ls后可以跟一个目录,也可以跟一个文件。以下是ls的选项,在这里笔者并没有完全列出,只是列出了平时使用最多的选项。其他选项,你可以自行通过man
ls 查询。
-a全部的档案都列出,包括隐藏的。linux文件系统中同样也有隐藏文件。这些隐藏文件的文件名是以.开头的。例如.test,
/root/.123, /root/.ssh 等等,隐藏文件可以是目录也可以是普通文件。
-l详细列出文件的属性信息,包括大小、创建日期、所属主所属组等等。ll这个命令等同于ls
–l 。



--color=never/always/auto never即不要显示颜色,always即总显示颜色,auto是由系统自行判断。在Redhat/CentOS系统中,默认是带颜色的,因为我们平时用的ls已经alias成了ls
–color=tty 所以目录的颜色是蓝色的,而可执行文件的颜色是绿色。这样有助于帮我们区分文件的格式。



-d后边跟目录,如果不加这个选项则列出目录下的文件,加上后只列车目录本身。



cp copy的简写,即拷贝。格式为
cp [选项] [来源文件 ] [目的文件],例如我想把test1拷贝成test2,这样即可
cp test1 test2,以下介绍几个常用的选项
-d这里涉及到一个“连接”的概念。连接分为软连接和硬连接。在以后的章节中会详细解释,现在你只要明白这里的软连接跟windows中的快捷方式类似即可。如果不加这个-d则拷贝软连接时会把软连接的目标文件拷贝过去,而加上后,其实只是拷贝了一个连接文件(即快捷方式)。



上例中的ln命令即为建立连接的,以后再做详细解释。
-r如果你要拷贝一个目录,必须要加-r选项,否则你是拷贝不了目录的。



-i如果遇到一个存在的文件,会问是否覆盖。在Redhat/CentOS系统中,我们使用的cp其实是cp
–i



下面简单做一个小试验,很快你就会明白-i选项的作用了。



上例中,touch命令,看字面意思就是摸一下,没错,如果有这个文件,则会改变文件的访问时间,如果没有这个文件就会创建这个文件。前面说过echo,其实就是打印,在这里所echo的内容”abc”和
“def”并没有显示在屏幕上,而是分别写进了文件 111和222,其写入作用的就是这个大于号”>”在linux中这叫做重定向,即把前面产生的输出写入到后面的文件中。在以后的章节中会做详细介绍,这里你要明白它的含义即可。而cat命令则是读一个文件,并把读出的内容打印到当前屏幕上。该命令也会在后续章节中详细介绍。
-u该选项仅当目标文件存在时才会生效,如果源文件比目标文件新才会拷贝,否则不做任何动作。
mv移动的意思,是move的简写。格式为
mv [ 选项 ] [源文件] [目标文件],下面介绍几个常用的选项。
-i和cp的-i一样,当目标文件存在时会问用户是否要覆盖。在Redhat/CentOS系统中,我们使用的mv其实是mv
–i
-u和上边cp命令的-u选项一个作用,当目标文件存在时才会生效,如果源文件比目标文件新才会移动,否则不做任何动作。
该命令有集中情况,你注意到了吗?
1)目标文件是目录,而且目标文件不存在;
2)目标文件是目录,而且目标文件存在;
3)目标文件不是目录不存在;
4)目标文件不是目录存在;
目标文件是目录,存在和不存在,移动的结果是不一样的,如果存在,则会把源文件移动到目标文件目录中。不存在的话移动完后,目标文件是一个文件。这样说也许你会觉得有点不好理解,看例子吧。



windows下的重命名,在linux下用mv就可以搞定。
cat比较常用的一个命令,即查看一个文件的内容并显示在屏幕上。
-n查看文件时,把行号也显示到屏幕上。



上例中出现了一个”>>”,这个符号跟前面介绍的”>”的作用都是重定向,即把前面输出的东西输入到后边的文件中,只是”>>”是追加的意思,而用”>”,如果文件中有内容则会删除文件中内容,而”>>”则不会。
-A显示所有东西出来,包括特殊字符



tac其实是cat的反写,同样的功能也是反向打印文件的内容到屏幕上。



more也是用来查看一个文件的内容。当文件内容太多,一屏幕不能占下,而你用cat肯定是看不前面的内容的,那么使用more就可以解决这个问题了。当看完一屏后按空格键继续看下一屏。但看完所有内容后就会退出。如果你想提前退出,只需按q键即可。
less作用跟more一样,但比more好在可以上翻,下翻。空格键同样可以翻页,而按”j”键可以向下移动(按一下就向下移动一行),按”k”键向上移动。在使用more和less查看某个文件时,你可以按一下”/”键,然后输入一个word回车,这样就可以查找这个word了。如果是多个该word可以按”n”键显示下一个。另外你也可以不按”/”而是按”?”后边同样跟word来搜索这个word,唯一不同的是,”/”是在当前行向下搜索,而”?”是在当前行向上搜索。
head head后直接跟文件名,则显示文件的前十行。如果加
–n 选项则显示文件前n行。



tail和head一样,后面直接跟文件名,则显示文件最后十行。如果加-n选项则显示文件最后n行。



-f动态显示文件的最后十行,如果文件是不断增加的,则用-f选项。如:tail
-f /var/log/messages

另外linux下还有两个比较特殊的权限s和t,请点击linux下文件的特殊权限s和t
umask
上边也提到了默认情况下,目录权限值为766,普通文件权限值为644。那么这个值是由谁规定呢?追究其原因就涉及到了umask。
umask语法: umask xxx(这里的xxx代表三个数字)
查看umask值只要输入umask然后回车。
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--)。



umask可以在/etc/bashrc里面更改,预设情况下,root的umask为022,而一般使用者则为002,因为可写的权限非常重要,因此预设会去掉写权限。
chattr修改文件的特殊属性
语法: chattr [+-=][ASaci [文件或者目录名]
+-=:分别为增加、减少、设定
A:增加该属性后,文件或目录的atime将不可被修改;
S:增加该属性后,会将数据同步写入磁盘中;
a:增加该属性后,只能追加不能删除,非root用户不能设定该属性;
c:自动压缩该文件,读取时会自动解压;
i:增加后,使文件不能被删除、重命名、设定连接、写入、新增数据;



增加i属性后不能在该目录中建立文件。



增加a属性后,只能追加不能删除。
lsattr列出文件/目录的特殊属性
语法: lsattr [-aR] [文件/目录名]
-a:类似与ls的-a选项,即连同隐藏文件一同列出;
-R:连同子目录的数据一同列出



在上例中,test4是在test3目录增加a属性后建立的,所以test4也有a属性,通过这个例子可以看出,chattr的属性是级联生效的,不仅对当前目录生效而且会对目录下的文件同样生效。
linux下搜索一个文件
在windows下有一个搜索工具,可以让我们很快的找到一个文件,这是很有用的。然而在linux下搜索功能更加强大。
which用来查找可执行文件的绝对路径。
在前面章节中已经多次用到该命令,需要注意的一点是,which只能用来查找PATH环境变量中出现的路径下的可执行文件。这个命令用的也是蛮多的,有时候我们不知道某个命令的绝对路径,which一下很容易就知道了。



当查找的文件在PATH变量中并没有时,就会报错。
whereis通过预先生成的一个文件列表库去查找跟给出的文件名相关的文件。
语法: whereis [-bmsu] [文件名称]
-b:只找binary文件
-m:只找在说明文件manual路径下的文件
-s:只找source来源文件
-u:没有说明档的文件



说明:whereis笔者几乎很少用到,如果你感兴趣请深入研究。
locate类似于whereis,也是通过查找预先生成的文件列表库来告诉用户要查找的文件在哪里。后边直接跟文件名。如果你的linux没有这个命令,请安装软件包
mlocate ,这个软件包在你的系统安装盘里,后缀名是RPM,随后介绍的find命令会告诉你如何查找这个包。如果你装的CentOS你可以使用这个命令来安装
yum install –y mlocate 。 前提是你的CentOS能连互联网。至于yum这个命令如何使用,到后续章节你自然会明白。如果你刚装上这个命令,初次使用会报错。



这是因为系统还没有生成那个文件列表库。你可以使用updatedb命令立即生成(更新)这个库。如果你的服务器上正跑着重要的业务,那么你最好不要去运行这个命令,因为一旦运行,服务器的压力会变大。这个数据库默认情况下每周更新一次。所以你用locate命令去搜索一个文件,正好是在两次更新时间段内,那你肯定是得不到结果的。你可以到/etc/updated.conf去配置这个数据库生成(更新)的规则。locate命令笔者用的也并不多,所以你只要明白有这么一个东西即可。你用到时再去深究其用法吧。
find这个搜索工具是笔者用的最多的一个,所以请你务必要熟悉它。
语法: find [路径]
[参数]下面介绍几个笔者经常用的参数
-atime +n:访问或执行时间大于n天的文件
-ctime +n:写入、更改inode属性(例如更改所有者、权限或者连接)时间大于n天的文件
-mtime +n:写入时间大于n天的文件
看到这里,你对这三个time是不是有些晕了,那笔者就先给你介绍一下这三个time属性。
文件的 Access time,atime是在读取文件或者执行文件时更改的。文件的
Modified time,mtime是在写入文件时随文件内容的更改而更改的。文件的
Create time,ctime是在写入文件、更改所有者、权限或链接设置时随
Inode 的内容更改而更改的。因此,更改文件的内容即会更改
mtime和 ctime,但是文件的 ctime可能会在
mtime未发生任何变化时更改,例如,更改了文件的权限,但是文件内容没有变化。如何获得一个文件的atime
mtime以及ctime?
ls -l命令可用来列出文件的 atime、ctime和
mtime。
ls -lc filename 列出文件的 ctime
ls -lu filename 列出文件的 atime
ls -l filename 列出文件的 mtime
atime不一定在访问文件之后被修改,因为:使用ext3文件系统的时候,如果在mount的时候使用了noatime参数那么就不会更新atime的信息。而这是加了
noatime 取消了,不代表真实情況。反正,這三個
time stamp都放在 inode中。若
mtime, atime修改inode就一定會改,既然
inode改了,那 ctime也就跟著要改了。
继续讲find常用的参数。
-name filename直接查找该文件名的文件,这个使用最多了。



-type type:通过文件类型查找。文件类型在前面部分已经简单介绍过,相信你已经大体上了解了。type包含了
f, b, c, d, l, s等等。后续的内容还会介绍文件类型的。



linux的文件系统
搞计算机的应该都知道windows的系统格式化硬盘时会指定格式,fat或者
ntfs。而linux的文件系统格式为Ext2,或者Ext3
。早期的linux使用Ext2格式,目前的linux都使用了Ext3。
Ext2文件系统虽然是高效稳定的。但是,随着Linux系统在关键业务中的应用,Linux文件系统的弱点也渐渐显露出来了,因为Ext2文件系统是非日志文件系统。这在关键行业的应用是一个致命的弱点。Ext3文件系统是直接从Ext2文件系统发展而来,Ext3文件系统带有日志功能,可以跟踪记录文件系统的变化,并将变化内容写入日志,写操作首先是对日志记录文件进行操作,若整个写操作由于某种原因
(如系统掉电)而中断,系统重启时,会根据日志记录来恢复中断前的写操作,而且这个过程费时极短。目前Ext3文件系统已经非常稳定可靠。它完全兼容Ext2文件系统。用户可以平滑地过渡到一个日志功能健全的文件系统中来。这实际上了也是ext3日志文件系统初始设计的初衷。
Linux文件系统在windows中是不能识别的,但是在linux系统中你可以挂载的windows的文件系统,linux目前支持MS-DOS,VFAT,FAT,BSD等格式。如果你使用的是Redhat或者CentOS,那么你不要妄图挂载NFS格式的文件到linux下,因为它不支持NFS。虽然有些版本的linux支持NFS,但不建议使用,因为目前的技术还不成熟。
Ext3文件系统为Redhat/CentOS默认使用的文件系统,除了Ext3文件系统外,有些linux发行版例如SuSE默认的文件系统为reiserFS,Ext3独特的优点就是易于转换,很容易在
Ext2和 Ext3之间相互转换,而具有良好的兼容性,其它优点
ReiserFS都有,而且还比它做得更好。如高效的磁盘空间利用和独特的搜寻方式都是Ext3所不具备的,速度上它也不能和
ReiserFS相媲美,在实际使用过程中,reiserFS也更加安全高效,据说反删除功能也不错。
ReiserFS的优势在于,它是基于 B*Tree快速平衡树这种高效算法的文件系统,例如在处理小于
1k的文件比 Ext3快 10倍。再一个就是
ReiserFS空间浪费较少,它不会对一些小文件分配 inode,而是打包存放在同一个磁盘块
(簇)中,Ext2/Ext3是把它们单独存放在不同的簇上,如簇大小为
4k,那么 2
个 100字节的文件会占用 2个簇,ReiserFS则只占用一个。当然
ReiserFS也有缺点,就是每升级一个版本,都要将磁盘重新格式化一次。

【ln建立连接档
前面提到过两次连接档的概念,现在终于该好好介绍下这部分内容了。连接档分为两种,硬连接(hard
link)和软连接(symbolic link)。
Hard Links上面内容中说过,当系统要读取一个文件时,就会先去读inode
table,然后再去根据inode中的信息到块区域去将数据取出来。而hard
link 是直接再建立一个inode连接到文件放置的块区域。也就是说,进行hard
link的时候实际上该文件内容没有任何变化,只是增加了一个指到这个文件的inode,不过这样一来就会有个问题,因为增加的inode会连接到块区域,而目录本身仅仅消耗inode而已,那么hard
link就不能连接目录了。请你记住,hard
link 有两个限制:1不能跨文件系统,因为不通的文件系统有不同的inode
table; 2
不能连接目录。
Symbolic Links跟hard
link不同,这个是建立一个独立的文件,而这个文件的作用是当读取这个连接文件时,它会把读取的行为转发到该文件所link的文件上。这样讲,也许比较绕口,那么就来举一个例子。现在有文件a,我们做了一个软连接文件b(只是一个连接文件,非常小),b指向了文件a。当读取b时,那么b就会把读取的动作转发到a上,这样就读取到了文件a。所以,当你删除文件a时,文件b并不会被删除,但是再读取b时,会提示无法打开文件。而,当你删除b时,a是不会有任何影响的。
看样子,似乎 hard link比较安全,因为即使某一个
inode被杀掉了,只要有任何一个 inode存在,那么该文件就不会不见!不过,不幸的是,由于
Hard Link的限制太多了,包括无法做目录的 link,所以在用途上面是比较受限的!反而是
Symbolic Link的使用方向较广!那么如何建立软连接和硬连接呢?这就用到了ln命令。
ln语法: ln [-s] [来源文件]
[目的文件]
ln常用的选项就一个-s,如果不加就是建立硬连接,加上就建立软连接。



在建立硬连接前后,123目录所占空间大小并没有改变。



当把源文件删除后,空间仍旧没有变化。说明了删除一个文件其实只是删除了inode信息。



不能创建目录的硬连接。



建立软连接后,456目录增加了4k



删除源文件后会提示“没有这个文件”的错误。



目录是可以软连接的。



删除软连接对源文件没有任何影响。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息