Linux文件与目录管理
1。目录与路径
a. 相对路径与绝对路径
绝对路径:从根目录/开始的;
相对路径:相对当前目录的;
目录访问常用到的指令:
cd 变换目录
pwd 显示当前目录
mkdir 建立一个新目录
rmdir 删除一个内容为空的空目录
. 代表当前层目录
.. 代表上层目录
~ 代表自己的家目录
~user 代表到user这个人的家目录
b. cd与pwd
cd 即change directory,变换当前目录
cd 相对路径或绝对路径
注意cd之后要有空格
cd .. 回到上一层目录
cd ../home 相对路径
cd /var/www 绝对路径
cd ~ 回到用户的家目录
cd ~test 回到test用户的家目录
pwd 即是print working directory显示当前所在目录,use it when you are lost.
c. mkdir和rmdir
mkdir 即make directory建立目录
mkdir [目录名称]
rmdir 即remove directory 删除目录
rmdir [目录名称]
注意:rmdir需要要删除的目录下为空,比较安全;如果要删除目录下所有的东西都删除,需要使用命令rm -rf [目录名称]
d. 环境变量PATH
我们知道应用程序的命令一般都放在bin或者sbin目录下,但是通常我们在某个目录下执行命令如ls,也可以执行。只是因为环境变量PATH的作用。
当执行一条指令的时候,系统会按照PATH定义的每个路径去搜寻文件,先搜寻到的指令文件先被执行。
输入
echo $PATH
可以显示系统当前的环境变量
如:
hemin@hemin-desktop:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
可以看到$PATH其实为一个字符串包含了各个路径,如
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
等
往PATH环境变量中添加新路径/root使用如下命令
PATH=$PATH:/root
即是对变量PATH赋值。
2。文件与目录管理
a. 显示
ls 显示文件名称,属性等
ls [-ailS]
可以使用的选项有ailS
-a 列出所有文件(连同隐藏文件)
-i 打印inode的值
-l 详细列出文件各个属性
-S 以文件大小排序
--color=never 不显示颜色
--color=always 均显示颜色
--color=auto 系统自动判断
b. 复制cp (copy)
cp [-drsu] [源文件] [目标文件]
-d
-r 目录的复制
如cp -r /bin /tmp/bin
-s 做成链接文件(类似Windows中的快捷方式)
-u(或者--update) 如果源文件较新,或者没有目标文件,才进行复制动作,经常用于备份操作
c. 删除文件remove
rm [-fir] [文件名]
-i 提供用户确认在删除文件之前(默认的)
-r 循环删除(递归的意思Recursive)
-f 强行删除force不会有提示确认
前面说过要删除一个空目录可以使用rmdir 目录名称
如果删除一个非空目录需要使用rm -rf 目录名称
即循环删除各个子目录并且强行删除没有提示确认。
d. 移动文件move
mv [-u] [源文件] [目录文件]
-u 为update缩写,当源文件比目标文件还新时才会动作
例如:
mv bashrc bashrc.old
mv bashrc bashrc2 /tmp //注意最后一个才是最终的目标文件,其他的都是源文件
mv命令的用途:
用作移动,移动文件或者命令很重要,可以使用-u(update)测试新旧文件,看看是否需要搬移;
另一个用途用于变更文件名,使用mv更改文件的文件名(因为是移动不是复制,移动之后不会保留源文件)。
举例:
mkdir test
mv test test2
现建立目录test,然后重命名test为test2
3。查看文件内容
a. cat [-n]和tac
cat是Concatenate(连续)的简写,主要功能是将一个文件的内容连续输出到屏幕上。
参数-n显示的同时会添加行号。
tac与cat相反,cat从第一行开始显示,tac从最后一行显示。
由于cat和tac都是全部显示,对于行数较多的内容不太方便,经常用于行数较少的。
b. more和less
相对于cat和tac,more和less更好用。
more [文件名]
此外more还可以和管道pipe一起使用,比如ls -al|more,这样可以分页显示输出的内容;
less [文件名]
less比more更好使用,more没有办法向前翻页,只能往后看,less可以向前和向后翻页,使用pageup, pagedown
此外显示的时候
输入/word 还可以在less显示的结果中搜索word字符
q 退出less画面
c. head和tail
head和tail用于读取某个文件的前几行或者后几行
head [-n number] [文件名]
tail [-n number] [文件名]
默认显示10行
如head -n 20 filename
tail -n 12 filename
d. nl
nl显示文件内容,并显示行号,与cat -n效果相同
e. od以二进制方式读取文件内容
od [文件名称]
4。链接文件
a. 什么是inode
硬盘的一些概念:
硬盘一般包括多个硬盘盘片;
磁道为每个盘片上磁头旋转一周所走过的轨迹Track
各个盘片上的磁道叠加起来构成的圆柱体,叫做磁柱Cylinder
同时每个磁道又被分割成多个区域,每个区域叫做一个扇区,扇区是硬盘的最小存储物理量,一个扇区的存储容量大约为512字节。Sector
知道了硬盘的大体结构,要使用硬盘需要进行硬盘分区,对硬盘进行分割的最小单位是磁柱,分割完后就是格式化,格式化之后才可以写入数据。
Linux格式化硬盘考虑inode和Block。
其中Block为硬盘记录文件内容数据的区域,由数个扇区组成;inode则是记录文件属性及放置在那个Block之内的信息。
因此每个文件占用一个inode,但系统需要寻找该文件的时候,会现搜寻inode table找到该文件的属性以及数据存放的Block位置,然后到相应的Block中去将数据取出。
简单来说inode和Block。每个文件对应一个inode,系统通过inode或者该文件的属性以及该文件所存放的Block,然后到该Block中存取该文件的数据。
由于inode会链接到Block块进而获取文件的内容,因此目录本身仅仅消耗inode。
b. Linux中的链接文件
Linux中的链接文件类似Windows中的快捷方式,链接又分为硬链接与符号链接
1) 硬链接
当系统读取某个文件的时候,会先读取inode table,然后根据inode的信息获知文件的属性以及文件的数据。
硬链接就是再建立一个inode使它指向放置文件数据的Block块,即另一个新的inode。
这样读取这两个inode可以达到相同的目的都能访问到文件的Block块。
因此硬链接即是再为文件添加一个inode。
由于目录本身仅仅消耗inode,因此硬链接不能用于链接目录。
硬链接的两个限制:
不能跨文件系统,因为不同的文件系统有不同的inode table;
不能链接目录;
2)符号链接
相对于硬链接,符号链接更类似于Windows中的快捷方式,它需要建立一个独立的文件,该文件指向文件本身,让数据读取操作指向所链接的那个文件。
对于硬链接如果一个文件的某个inode被删除,只要还有一个inode,该文件就能被找到。
对于符号链接,如果源文件删除了,符号链接就无法找到原来指向的文件。
和windows中的快捷方式不同的是,如Windows中对快捷方式操作不会影响到源文件,而Linux下对符号链接操作,会影响所链接文件中的内容。
此外使用ls -l,硬链接显示的第一个属性为-代表一个文件;符号链接显示的第一个属性为l,代表链接文件。
ln [-s] [源文件] [目标文件]
-s 提供符号链接,如果直接使用ln不添加任何参数,就属于硬链接
举例:
mkdir test
cd test
cp /usr/bin/passwd . //将文件passwd拷贝到.,.代表当前目录
ls -l
ln passwd passwd-hard //建立一个硬链接passwd-hard指向passwd文件
ls -l
cd ..
ln test test-hard //将会失败,因为不能为一个目录建立硬链接
cd test
ln -s passwd passwd-soft //添加-s选项建立符号链接
ls -l //显示到passwd-soft的第一个属性为l,代表一个链接文件
此外,如果删除源文件passwd,硬链接passwd-hard使用more仍旧可以显示内容;
但是符号链接passwd-soft就会提示找不到文件
rm passwd //不添加命令-f会提示用户删除确认
more passwd-hard //仍旧会正确显示文件内容
more passwd-soft //则会提示找不到文件
5。文件与目录权限
a. chown 改变文件或者目录的拥有者以及群组
chgrp改变文件或者目录的群组
chown [-R] user:group
-R可以循环地将目录下的所有文件都改成user:group
chgrp [-R] group
b. chmod修改文件的属性
chmod [-R] [parameter] [文件或者目录名称]
-R循环地将目录的文件都修改
c. umask
建立一个新的文件或者目录时,默认属性与umask有关。
umask用于指定当前用户建立文件或者目录时的属性默认值。
umask为4位数字,后3个代表对应的3组9个属性
输入umask显示为0022
则默认的属性值为0777-0022得到0755即是-rwxr-xr-x
可以设置umask,从而修改建立新文件的默认属性
设定umask使用命令
umask 3个数字
如umask 002
则新建立的文件默认属性为0777-002=0775即是-rwxrwxr-x
默认情况下umask为0022
一句话umask的意义能够确定新建立文件的默认属性,为777-umask的值
可以设置umask的值,从而可以得到umask的结果。
如果重新启动终端以后,umask会重置umask的值。
d. chattr和lsattr
chattr [+-=] [Asacdistu] [文件或目录名称]
参数说明
[root @test /root ]# chattr [+-=][ASacdistu] [档案或目录名称]
参数说明:
+-= :分别为 [+ 增加] [- 减少] [= 设定] 属性的意思
A :当设定了 A 这个属性时,这个档案(或目录)的存取时间 atime (access) 将不可被修改,
可避免例如手提式计算机容易有磁盘 I/O 错误的情况发生!
S :这个功能有点类似 sync 的功能!就是会将数据同步写入磁盘当中!可以有效的避免数据流失!
a :当设定 a 之后,这个档案将只能增加数据,而不能删除,只有 root 才能设定这个属性。
c :这个属性设定之后,将会自动的将此档案『压缩』,在读取的时候将会自动解压缩出来!
但是在储存的时候,将会先进行压缩之后再储存(看来对于大档案似乎蛮有用的!)
d :当 dump (备份)程序被执行的时候,设定 d 属性将可使该档案(或目录)具有 dump 功效!
i :这个 i 可就很厉害了!他可以让一个档案『不能被删除、改名、设定连结也无法写入或新增数据!』
对于系统安全性有相当大的帮助!
j :当使用 ext3 这个档案系统格式时,设定 j 属性将会使档案在写入时先记录在 journal 中!
但是当 filesystem 设定参数为 data=journalled 时,由于已经设定了日志了,所以这个属性无效!
s :当档案设定了 s 参数时,他将会被完全的移除出这个硬盘空间。
u :与 s 相反的,当使用 u 来设定档案时,则数据内容其实还存在磁盘中,可以使用来 undeletion.
最重要的属性为+i属性,让一个文件无法被更改,对于系统安全性要求很高的很重要。
对于日志类的文档,+a属性可以增加但是不会被删除。
lsattr [-aR]
-a 将隐藏文件的属性也显示出来
-R 连同子目录的数据一并显示出来
6。搜索文件或目录
Linux包含有优秀的搜寻系统。
a. which 用于查看可执行文件或命令的位置
which [文件或者指令的名称]
如果
which ls
显示/bin/ls
b. whereis和locate查看文件的位置
whereis [-bmsu] [目录名称]
-b 只找二进制文件
-m 只找在说明文件manual路径下的文件
-s 只找source源文件
-u 没有说明文档的文件
不加任何参数,则所有的数据都罗列出来。
locate [目录名称]
locate使用比较简单,只需要在后面直接添加要找的文件名即可。
c. find
find [路径] [参数]
参数说明比较复杂
[root @test /root ]# find [路径] [参数]
参数说明:
1. 时间:
-atime n :在 n*24 小时内被 access 即存取过的档案列出来!
-ctime n :在 n*24 小时内被 changed 即改变、新增的档案或目录印出
-mtime n :在 n*24 小时内被 modified 即修改过的档案印出
-newer file :比 file 还要新的档案就列出来!
2. 使用名称:
-gid n :寻找 群组 ID 为 n 的档案
-group name :寻找群组名称为 name 的档案
-uid n :寻找拥有者 ID 为 n 的档案
-user name :寻找使用者名称为 name 的档案
-name file :寻找档名为 file 的文件名称(可以使用万用字符)
-type type :寻找档案属性为 type 的档案,type 包含了 b, c, d, p, l, s,
这些与前一章的属性相同!例如 l 为 Link 而 d 为路径之意!
范例:
[root @test /root]# find / -name testing <==寻找档名为 testing
[root @test /root]# find / -name 'test*' <==寻找档名包含 test 的!
[root @test /root]# find . -ctime 1 <==寻找目前目录下一天内新增的目录或档案
[root @test /root]# find /home/test -newer .bashrc <==寻找 /home/test 目录下比 .bashrc 还要新的档案
[root @test /root]# find /home -user test <==寻找 /home 底下拥有者为 test 的档案
[root @test /root]# find /dev -type b <==寻找 /dev 这个目录下,档案属性为 b 的档案
使用搜索建议
查看可执行文件的目录使用which命令;
查看不同的文件,应该先使用whereis和locate,如果找不到了才使用find查找。
因为,finde会根据定义的参数到指定的目录中去寻找文件,需要读硬盘。
而whereis和locate则不是需要读硬盘,而是查询数据库文件。
Linux系统会将系统内的所有文件都记录在一个数据库文件中,使用whereis或者locate的时候会以数据库文件的内容为准进行搜寻,不会到硬盘中搜寻文件。
Linux每天会对该数据库文件执行updatedb动作。
有时候会发现,使用whereis或者locate搜寻,会找到已经被删除的文件,这可能是因为updatedb动作还没有执行。
7。SUID(SetUID), SGID(SetGID), Sticky bit, file
a. SUID, SGID
复习UID与GID,Linux中每个帐户都有对应的UID:GID
查看/etc/passwd文件可以查看系统中的所有帐号
more /etc/passwd
显示所有帐号的信息,其中第3、4字段的数字代表UID和GID,其中root的UID和GID都是0
hemin@hemin-desktop:~$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 29104 2007-05-18 17:59 /usr/bin/passwd
其中s取代了x的属性,这里的s就叫做SUID,如果代替group部分的x为s,则叫做SGID。
当一个文件具有SUID时,同时others群组具有可执行权限,那么others群组执行该程序的时候,others将拥有该文件的owner权限。
b. sticky bit
如果一个目录的others最后的x被t取代sticky bit属性,这个属性的最大用处在于:具有sticky bit属性的目录,其下的文件或者目录只有文件拥有者及root才有权删除。
举个例子/tmp目录下
所有人都可以擦写的权力,但是每个人只能删除自己建立的文件,除了root。
ls -l /
注意查看/tmp目录的属性
drwxrwxrwt 13 root root 4096 2007-11-26 13:12 tmp
最后一个x被t所代替
c. file
file [文件名]
file可以用来查看文件的类型,同时可以显示文件是否被加入SUID等信息
FAQ:
1。
绝对路径,从/根目录开始;
相对路径,相对当前目录,可以使用
.
..
~
~user
2。更改一个目录的名称,即是重命名,可以使用文件移动命令mv
3。PATH环境变量的意义
可以在任何目录下使用一些指令,将这些指令所在的路径添加到PATH变量中,这样每当使用该命令的时候,会现根据PATH环境变量中的路径搜寻该指令,然后执行。
echo $PATH 显示当前环境变量的值
修改环境变量的值使用
如PATH=$PATH:/root
4。umask
umask的值为一个4为数字(第一位数字没用为0,后3个数字代表3组9个属性),它可以决定新建的文件或者目录的默认属性
为0777-umask的值。
通过umask加一个3位数字,重新定义umask的值,这样新建的文件或者目录的值就变成了0777-新的umask的值。
不过重新启动终端,umask重新恢复默认值,默认值为0022。
这样新建的文件或者目录的默认属性为0777-0022=0755即是-rwxr-xr-x
5。当一个用户设置的umask为033或者044则所新建的文件和目录的权限为
0777-0033=0744 即是-rwxr--r--
0777-0044=0733即是-rwx-wx-wx
6。什么是SUID
取代9位属性的第一组的第三个可执行x为s,代表的意思如下
文件具有SUID,如果others具有可执行权限,则当others群组执行该程序的时候,others将拥有该文件的owner权限。
7。查看/usr/bin/passwd文件的属性使用指令
lsattr /usr/bin/passwd
或者ls -l /usr/bin/passwd