首页 > 代码库 > linux--档案与目录管理

linux--档案与目录管理

下面是最近学习档案与目录管理的一些知识点总结
********博客园-邦邦酱好********


******************************目录的相关操作**********************************
1.特殊目录
(1).:代表此层目录
(2)..:代表上一层目录
(3)-:代表前一个工作目录
(4)~:代表【目前用户身份】所在的家目录
(5)~account:代表account这个用户的家目录

2.变换目录cd(change directory)

3.显示目前所在的目录pwd(Print Working Directory)
pwd [-P]
-P:显示出确实的路径,而非使用链接路径
cd /var/mail
pwd -->/var/mail
pwd -P  -->/var/spool/mail
因为/var/mail是连结档,连结到/var/spool/mail

4.建立新目录mkdir
mkdir [-mp] 目录名称
-m:直接配置文件的权限
-p:帮助直接将所需要的目录(包含上层目录)递归建立起来
如:
mkdir -m 711 test1           #设定目录权限为rwx--x--x
mkdir -p test1/test2/test3   #自动建立多层目录

5.删除[空]的目录rmdir
rmdir [-p] 目录名称
-p:连同上层空的目录也一起删除
如:
mkdir -p test1/test2/test3
rmdir -p test1/test2/test3  #删除test3文件夹,它的上层目录test2,再上层目录test1都被删除
注意:上例中test1,test2,test3里不存在其他的目录或档案,否则会删除失败。
如果想要删除目录下的所有东西,请使用rm -r test,这样test文件夹以及它底下的东西都会被删除

6.关于执行文件路径的变量:$PATH
当我们在执行一个指令的时候,举例来说[ls]好了,系统会依照PATH的设定去每个PATH定义的目录下搜寻文件名为ls的可执行文件,如果在PATH定义的目录中有多个文件名为ls的可执行文件,那么先搜寻到的同名指令会先被执行。
无论是root还是一般用户都有/bin这个目录在PATH变量内,但是一般用户的PATH中,不包含任何sbin的目录。
如果命令被移动了位置,那系统就不能通过PATH路径去寻找它了。我们只能透过使用绝对路径或相对路径来直接指定执行命令的档案名
本目录(.)最好不要放到PATH当中。



*****************************档案与目录管理******************************
1.档案与目录的检视ls
ls [-adhilrt] 目录名称
-a:全部的档案,连同隐藏档一起列出来
-d:仅列出目录本身,而不是列出目录内的档案数据
-h:将档案容量以人类较为易读的方式列出来(GB,KB等)
-i:列出inode号码
-l:长数据串输出,包含档案的属性与权限等等数据
-r:将排序结果反向输出
-t:依内容变更时间排序,而不是用档名
--color=never:不要依据档案特性给予颜色显示
--color=always:显示颜色
--color=auto:让系统自行依据设定来判断是否给予颜色
--full-time:以完整时间模式(年,月,日,时,分)输出档案的修改时间
--time=(atime,ctime):输出access时间或改变权限属性时间(ctime)而非内容变更时间
注意:不加参数时,默认显示非隐藏档的档名,以档名进行排序以及文件名代表的颜色显示

2.复制cp
cp [-adfipr] source destination
-a:相当于-pdr
-d:若source为软链接文件的属性(link file),则复制链接文件属性而非档案本身,就是说复制出来的文件也是link file。
-f:若目标档案已经存在且无法开启,则移出后再尝试一次
-i:若destination已经存在,在覆盖时给予询问
-p:连同档案的属性一起复制过去,而非使用默认属性(备份常用)
-r:递归持续复制,用于目录的复制行为
-l:进行硬式连结(hard link)的连结档建立,而非复制档案本身
-s:复制成符号链接文件(symbolic link),亦即快捷方式档案
-u:若destination比source旧,才更新destination(备份常用)。

注意:
1)若source有2个以上,则最后一个destination一定要是目录才行。
2)被复制的档案必须有read权限才行,否则复制失败
3)当进行备份时,某些需要特别注意的特殊权限档案,如密码文件/etc/passwd以及一些配置文件,就不能直接以cp来复制,必须加上-a或者-p来完整复制档案权限的选项才行(预设情况下,(owner和group是指令操作者本身,但若操作者本身不能随意修改档案的拥有者和群组,-p参数也不能更改文件的owner和group)
4)复制档案给其他使用者之后,要注意档案的权限(读写执行以及拥有者等),否则,其他人还是无法针对你给予的档案进行修订动作。

******************************************************************************************

补充知识:
硬链接:是一个指针,指向文件索引点,系统不为它重新分配inode。
创建命令:ln existingfile newfilehard
注意:
1)创建之后使用ls -il可以查看newfile的inode号码,existingfile和newfilehard的inode号应该是一样的,说明它们是同一个文件,所以属性大小跟原文件一样。
ls -il
-->13059 -rwx------ 2 root root 57 11月5 15:30 existingfile
-->13059 -rwx------ 2 root root 57 11月5 15:30 newfilehard
2)每对一个文件创建一个硬链接,它们的文件连结数都会+1.
缺点:
1)不可在不同文件系统的文件间建立链接;
2)只有超级用户才可以为目录创建硬链接;

软链接(符号链接):是一个快捷方式,软连接的文件会被分配新的inode号,他克服了硬链接的不足点
建立命令:ln -s existingfile newfilesoft
注意:软连接原文件和链接文件会拥有不同的inode号,表明它们是两个不同的文件。
ls -il
-->13059 -rwx------ 2 root root 57 11月5 15:30 existingfile
-->13059 -rwx------ 2 root root 57 11月5 15:30 newfilehard
-->13060 lrwxrwxrwx 1 root root 5 11月5 15:40 newfilesoft->existingfile
缺点:当原文件从一个目录下移到其它目录下,再访问符号链接文件,就会访问失败。
******************************************************************************************

3.移出档案或目录rm
rm [-fir] 档案或目录
-f:force,忽略不存在的档案,不显示警告信息
-i:互动模式,在删除前进行询问
-r:递归删除
注意:
1)预设中已经加入-i的选项,所以要一直按y才会删除,如果想终止删除操作,可以输入n或者按下ctrl+c。
2)如果想忽略预设的选项,可以在命令前加入反斜杠,忽略掉alias的指定选项。如:\rm -r /tmp/test
3)查看命令是否有别名,输入alias即可显示系统的所有别名,或者type 命令名会显示这个命令是否是alias,keyword,function,builtin,file或者什么都不是。
4)删除一个-开头的档案(如-aaa-)时,要这样删除:rm ./-aaa-(./是本目录的意思)

4.移动档案或目录mv
mv [-fiu] source destination
-f:force,如果目标档案已存在,不询问,直接覆盖
-i:如果目标档案已存在,进行询问
-u:如果目标档案已存在,且source比较新,才进行覆盖
注意:
1)可对某个文件进行更名操作:mv file_name file_new_name(相当于rename命令)
2)移动N个文件到某个目录下:mv file1 file2 destination_dir

5.取得路径的文件名和目录名称
(1)获取文件名:
basename /etc/sysconfig/network
-->network
(2)获取路径
dirname /etc/sysconfig/network
-->/etc/sysconfig


*******************************档案内容查询********************************
1.由第一行开始显示档案内容cat
cat [-AbEnTv] filename
-A:相当于-vET
-b:列出行号,仅对非空白行做行号显示,空白行不标行号
-E:将结尾的断行符$显示出来
-n:列出行号,空白行也标行号
-T:将tab键以^I显示出来
-v:列出一些看不出来的特殊字符

2.从最后一行开始反向显示tac
tac filename

3.显示时,顺道输出行号nl
nl [-bnw] filename
-b:指定行号的方式
    -b a:不论是否有空行,列出行号(类似于cat -n)
    -b t:如果有空行,不列出空行的行号(类似于cat -b,是默认值)
-n:列出行号的方式
    -n ln:行号在屏幕的最左方显示
    -n rn:行号在自己字段的最右方显示,且不加0;
    -n rz:行号在自己字段的最右方显示,且加0;
-w:行号字段占用的位数
如:
nl -b a -n rz -w 3 /etc/issue
001 CentOS release 5.3(Final)
002 Kernel \r on an \m
003


4.一页一页地显示档案内容more
more filename
最后一行会提示目前显示的百分比,且可以在最后一行输入有用的指令
可用的按键:
1)空格键:向下翻一页
2)Enter:向下翻一行
3)/字符串:在当前显示的内容中,向下寻找这个字符串
4):f:显示文件名以及目前显示的行数
5)q:离开more,不再显示
6)b或ctrl+b:往回翻页,只对档案有效,对管线无效

5.一页一页地显示且可以翻页less
less filename
可用的按键:
1)空格键:向下翻一页
2)Pagedown:向下翻一行
3)Pageup:向上翻一行
4)/字符串:在当前显示的内容中,向下寻找这个字符串
5)?字符串:在当前显示的内容中,向上寻找这个字符串
6)n:重复前一个搜寻
7)N:反向重复前一个搜寻
8)q:离开more,不再显示

6.只看头几行head
head -n number filename
-n number:显示number行
如:
head -n -100 /etc/man.config   #number可以是负数
--->显示前面所有的行,但不包含最后100行

7.只看尾巴几行tail
tail -n number filename
-n number:显示最后的number行,不加选项的话,默认显示最后10行(包含空白行)
如:
tail -n +100 /etc/man.config  
--->假如文档有140行,则从第100行开始,显示之后的所有数据100-140行
****显示文档的第11到第20行:head -n 20 /etc/man/config|tail -n 10


8.以二进制的方式读取内容od
od [-t TYPE] filename
-t:后接各种类型TYPE的输出,如
    a:利用默认字符来输出
    c:利用ASCII字符来输出
如:
od -t oCc /etc/issue
--->以八进位列出存储值与ASCII的对照表


9.修改档案时间或建新档touch
1)ls指令下的3个时间参数
   *modification time(mtime):当档案内容变更时,更新这个时间
   *status time(ctime):当档案状态(如权限与属性)变更时,更新这个时间
   *access time(atime):当档案内容被读取(如cat)时,更新这个时间
ls命令默认显示mtime,要显示其他时间,可以这样:
--->ls -l --time=atime/ctime filename

2)touch指令
touch [-acdmt] filename
-a:仅修订atime
-c:仅修改档案的时间(mtime,atime),若档案不存在,不建立新档案
-d:后接欲修订的日期,也可以使用--date=日期或时间
-m:仅修订mtime
-t:后接欲修订的时间YYMMDDhhmm
*查看文档的三个时间:
cp -a ~/.bashrc bashrc
ll bashrc;ll --time=atime bashrc;ll--time=ctime bashrc  #ll是一个别名,相当于ls -l
--->分别列出bashrc的档案最新的修订时间,读取时间和状态修改时间
*修复文档的时间
touch -d "2 days ago" bashrc
--->只有mtime和atime改变了,ctime无法被修改



*******************************档案与目录的默认权限与隐藏权限********************************
1.档案预设权限umask
umask [-S]
umask:显示目前用户在建立档案或目录时的权限默认值,以数字形态显示,7-分数=实际权限
umask -S:以符号类型的方式显示出权限默认值

在默认权限的属性上,目录与档案是不一样的:
1)档案 666=-rw-rw-rw-(一般档案不给于x权限)
2)目录 777=drwxrwxrwx(目录的x权限决定了它能否使用cd命令进入目录)

假如当前用户是root,进行umask命令后回显示022(也就是----w--w--),所以
1)建立档案时:(-rw-rw-rw-)-(----w--w--)=(-rw-r--r--)
2)建立目录时:(drwxrwxrwx)-(----w--w--)=(drwxr-xr-x)

如果想要改变umask的默认值,改为003,可以先输入:umask 003,再执行新建档案或文档操作
(一般情况下,root的umask是022,一般用户的umask是002)

2.配置档案隐藏属性chattr
chattr [+-=][ASacdistu] filename/dirname
+:增加一个特殊参数,其他原本存在的参数不动
-:移出一个特殊参数,其他原本存在的参数不动
=:设定一定,且仅有后面接的参数

A:存取该档案时,访问时间atime不会被修改
S:sync,对档案的任何修改,更动会同步写入磁盘中
a:只有root才能设定a属性,设定之后档案只能增加数据,不能删除也不能修改数据(常用)
c:保存时自动压缩,读取时自动解压缩
d:dump程序被执行时,该档案不会被dump备份
i:使得档案不能被删除,改名或设定连结,无法写入或新增资料(常用)
s:如果档案被删除,它会被完全移出出这个硬盘空间,无法挽救
u:与s相反,使用u来配置档案时,如果档案被删除,数据还在硬盘中,可以挽救

3.显示档案隐藏属性lsattr
lsattr [-adR] filename/dirname
-a:将隐藏文件的属性也显示出来
-d:如果后接的是目录,仅列出目录本身的属性而非目录内的文件名
-R:连同子目录的数据也列出来

4.档案特殊权限
1)Set UID -->U=User,owner
查看/usr/bin/passwd的权限,得到:-rwsr-xr-x,它含有s,也就是SUID的特殊权限。
说明了以下事情:
1.首先s权限仅对二进制程序有效,所以passwd是一个二进制文件(跟shell script文件不一样哦)
2.谁(root或一般用户)想要执行passwd程序,都可以执行。所以所有执行者对它都有x的执行权限
3.执行者执行passed程序时,只是暂时获得了root的权限来执行它而已
4.执行者对程序是owner的身份
档案具有SUID的特殊权限时,代表当用户执行此binary程序时,在执行过程中用户会暂时具有程序拥有者的权限。

2)Set GID
当标志在档案的拥有者的x项目为s(SUID),那s在群组的x时就是Set GID了!
目录具有SGID的特殊权限时,代表用户在这个目录底下新建的档案群组都会与该目录的组名相同。

****************************************************************************
如何创建一个二进制文件
dd if=/dev/zero of=hello.txt bs=1M count=1
/dev/zero---该设备无穷尽地提供0
/dev/null---外号叫无底洞,你可以向它输出任何数据
****************************************************************************

3)SBIT权限
前提:用户甲对目录A是群组或其他人身份,并且对该目录有w的权限。也就是说用户甲对该目录内任何人建立的目录或档案都可以进行“删除/更名/移动”等操作。
SBIT权限:如果对目录A加上SBIT权限,这是用户甲就只能对自己建立的档案或目录进行“删除/更名/移动”等操作。

4)SUID/SGID/SBIT权限的设定
(1)数值:SUID:4(u+s)  SGID:2(g+s)   SBIT:1(o+t)
(2)设定:在原来的rwx权限数值前加上一个数值
     如:4755=-rwsr-xr-x,6755=-rwsr-sr-x,1755=rwxr-xr-t
(3)大写S,T:7666=-rwSrwSrwT(666就是没有x权限,所以大写的ST就是表示空权限)

5.观察文件类型file
file filename -->说明文档是什么类型:ASCII,data,binary



*******************************档案与目录的搜寻********************************
脚本文件名的搜寻
1)which(寻找执行脚本)
which [-a] command
-a:将所以由PATH目录中科院找到的指令均列出,不止第一个被找到的指令名称
(注意:which是根据用户的PATH路径去寻找的,不同用户的PATH路径不一样,所以搜寻的结果也会不一样)
如:
which cd  --->no cd in ...
#which的预设是找PATH内规范的目录,但cd是bash内建的指令,所以是找不到的


#find命令不常用,因为它速度慢,耗硬盘。linux系统会将系统内的所有档案都记录在一个数据库档案里,whereis和locate是利用数据库来搜寻数据的,所以速度快,而且没有实际的搜索硬盘,比较省时间。
2)whereis(寻找特定档案)
whereis [-bmsu] 档案或目录名
-b:只找binary格式的档案
-m:只找在说明文件manual路径下的档案
-s:只找source来源档案
-u:搜寻不在以上三个项目中的其他特殊档案

3)locate
locate [-ir] keyword
-i:忽略大小写的差异
-r:后面可接正则表达式的显示方式

限制:locate寻找的数据是由已建立的数据库/var/lib/mlocate/里的数据所搜寻到的,不直接去硬盘里存取数据。
但是数据库的建立默认是每天只执行一次(每种distribution都不同),所以当你新建起来的档案,却在数据库更新前进行搜寻,那么locate会告诉你找不到!
解决:手动更新数据库!直接输入“updatedb”就可以了。updatedb指令会去读取/etc/updatedb/conf这个配置文件的设定,然后去硬盘里进行搜寻文件名的动作,最后更新整个数据库档案。

4)find
find [PATH] [option] [action]
option与时间有关的选项:
    -mtime n:n是数字,意思是n天之前的[一天之内]被更动过内容的档案
    -mtime +n:列出在n天之前(不含n天本身)被更动过内容的档案
    -mtime -n:列出在n天之内(含n天本身)被更动过内容的档案
    -newer file:file是一个存在的档案,列出比file还要新的档案档名

              <-4->  
                 -4------------->          
<-------|--|--+4-|--|--|--|--|--|
<-------|--|--|--|--|--|--|--|--|
           7  6  5  4  3  2  1  now    

其他与使用者或组名相关,与档案权限及名称相关,以及一些额外的动作选项,就不详说了~


**********************************权限与指令间的关系***********************************
1.让用户进入某目录的基本权限:
1)可使用的指令:如cd
2)目录所需的权限:用户对目录至少有x权限
3)额外需求:如果用户想ls,还需要r权限

2.用户在某目录内读取一个档案的基本权限:
1)可使用的指令:如cat,more,less等
2)目录所需的权限:用户对目录至少有x权限
3)档案所需的权限:用户对档案至少有r权限

3.让用户修改某档案的基本权限:
1)可使用的指令:如vi
2)目录所需的权限:用户在该档案所在的目录至少有x权限
3)档案所需的权限:用户对档案至少有r权限

4.让一个用户建立一个档案的基本权限:
目录所需的权限:用户在该目录有w,x权限,重点是w

5.让用户进入某目录并执行该目录下的某个指令的基本权限:
1)目录所需的权限:用户在该档案所在的目录至少有x权限
2)档案所需的权限:用户对档案至少有x权限


****************************************练习题**********************************************
例题:在系统中有2个账户,分别是alex,arod,他们除了自己的群组外,还共同支持一个名为project的群组。假设这2个用户共同拥有/srv/ahome目录的开发权,且该目录不许其他人进入查询。请问该目录的权限要如何设定?
#进入root账户,新建2个账户,alex和arod,以及群组project
[wjf@localhost ~]$ su root
Password:
[root@localhost]# groupadd project
[root@localhost]# useradd -G project alex
[root@localhost]# useradd -G project arod
#id命令可查看账户所属的群组
[root@localhost]# id alex
uid=501(alex) gid=502(alex) groups=502(alex),501(project)
[root@localhost]# id arod
uid=502(arod) gid=503(arod) groups=503(arod),501(project)
[root@localhost]# mkdir /srv/ahome
[root@localhost]# ll /srv/ahome/
total 0
#由上下可知,对于目录的ls要加上参数-d
[root@localhost]# ll -d /srv/ahome/
drwxr-xr-x. 2 root root 4096 Nov 11 11:04 /srv/ahome/
#改变/srv/ahome目录的所属群组,这个目录才能被project群组内的账户访问
[root@localhost]# chgrp project /srv/ahome/
[root@localhost]# ll -d /srv/ahome/
drwxr-xr-x. 2 root project 4096 Nov 11 11:04 /srv/ahome/
#改变群组后,还需要给群组赋予w权限(新建删除更名目录下的文件)。
#由root的预设权限umask可知root的是022,也就是它新建的目录在群组下是没有w权限的
[root@localhost ahome]# chmod 770 /srv/ahome/
[root@localhost ahome]# ll -d /srv/ahome/
drwxrwx---. 2 root project 4096 Nov 11 11:04 /srv/ahome/
[root@localhost ahome]# su alex
[alex@localhost ahome]$ touch abcd
[alex@localhost ahome]$ su root
Password:
[root@localhost ahome]# su arod
#下面可见alex新建的文档群组是alex,而不是共同的群组project,arod无法编辑它。
[arod@localhost ahome]$ ll abcd
-rw-rw-r--. 1 alex alex 0 Nov 11 11:12 abcd
[arod@localhost ahome]$ exit
exit
#修改目录的权限为SGID
#目录具有SGID的特殊权限时,代表用户在这个目录底下新建的档案群组都会与该目录的组名相同。
[root@localhost ahome]# chmod 2770 /srv/ahome/
[root@localhost ahome]# ll -d /srv/ahome/
drwxrws---. 2 root project 4096 Nov 11 11:12 /srv/ahome/
[root@localhost ahome]# su alex
[alex@localhost ahome]$ touch 1234
#修改目录权限后可见:alex新建的文档1234的群组是project啦~
[alex@localhost ahome]$ ll
total 0
-rw-rw-r--. 1 alex project 0 Nov 11 11:14 1234
-rw-rw-r--. 1 alex alex    0 Nov 11 11:12 abcd
[alex@localhost ahome]$


linux--档案与目录管理