Linux文件与目录管理
一、目录的相关操作
比较特殊的目录:
. 代表此层目录
.. 代表上一层目录
- 代表前一个工作目录
~ 代表“目前用户身份”所在的主文件夹
~account 代表account这个用户的主文件夹(account是个账号名称)
处理目录的命令:
cd: 切换目录
pwd: 显示当前目录
mkdir: 新建一个新的目录
rmdir: 删除一个空的目录
1、cd(切换目录)(change directory)
cd [相对路径或绝对路径]
特殊 cd ~ 可以回到个人的主文件夹里去
2、pwd (print working directory)
pwd [-P]
参数:
-P :显示出当前的路径,而非使用连接(link)路径。
3、mkdir(make directory)
mkdir [-mp] 目录名称
参数:
-m: 配置文件的权限,直接设置,不需要看默认权限(umask)
-p: 帮助你直接将所需要的目录(包含上层目录)递归创建起来。
创建多层目录: mkdir -p test1/test2/test3
新建权限为rwx--x--x的目录: mkdir -m 711 test2
4、rmdir [-p] 目录名称 (remove directory)
参数:
-p: 连同上层“空的”目录也一起删除
二、文件与目录管理
1、查看文件与目录:ls
语法: ls [-aAdfFhilnrRSt] 目录名称
ls [--color={never,auto,always}] 目录名称
ls [--full-time] 目录名称
参数:
-a: 全部的文件,连同隐藏文件(开头为.文件)一起列出来
-A : 列出全部的文件(连同隐藏文件,不包括.与..那两个目录)
-d: 仅列出目录本身,而不是列出目录内的文件数据
-f: 直接列出结果, 而不进行排序(ls默认会以文件名排序)
-F: 根据文件、目录等信息给予附加数据结构,例如:
*:代表可执行文件 /:代表目录 =:代表socket文件 l: 代表FIFO文件
-h : 将文件容量以人类易读的方式(例如GB,KB等)列出来
-i: 列出inode号码,inode的意义下一章将会介绍
-l: 列出长数据串, 包含文件的属性与权限等数据
-n: 列出UID与GID,而非用户与用户组的名称(UID与GID会在账号管理提到)
-r: 将排序结果反向输出,例如:原本文件名由小到大,反向则为由大到小
-R: 连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来
-S: 以文件容量大小排序,而不是用文件名排序
-t: 依时间排序,而不是用文件名
--color=never : 不要依据文件特性给予颜色显示
--color=always : 显示颜色
--color=auto : 让系统自行依据设置来判断是否给予颜色
--full-time: 以完整时间模式(包含年、月、日、时、分)输出
--time={atime, ctime}: 输出访问时间或改变权限属性时间(ctime)
而非内容更改时间(modification time)
2、复制、删除与移动:cp, rm, mv
cp(copy): 除了单纯复制之外,还可以创建连接文件(就是快捷方式),对比两文件的新旧而予以更新,以及复制整个目录等功能。
语法:
cp [-adfilprsu] 源文件 目标文件
cp [options] source1 source2 source3 ... directory
参数:
-a: 相当于-pdr的意思
-d: 若源文件为连接文件的属性(link file), 则复制连接文件属性而非文件本身。
-f: 为强制(force)的意思,若目标文件已存在且无法开启,则删除后再尝试一次
-i: 若目标文件已经存在, 在覆盖时会先询问操作的进行
-l: 进行硬连接(hard link)的连接文件创建,而非复制文件本身
-p: 连同文件属性一起复制过去, 而非使用默认属性(备份常用)
-r: 递归持续复制, 用于目录的复制行为(常用)
-s: 复制成为符号链接文件(symbolic link),即“快捷方式”文件
-u: 若destination比source旧才更新destinatioin
最后注意,如果源文件有两个以上,则最后一个目的文件一定要是“目录”才行
在默认情况下,cp的源文件与目的文件的权限是不同的,目的文件的所有者通常会是命令操作者本身。加上-a或-p等可以完整复制文件权限的参数才行。
由于cp有种种的文件属性与权限的特性,所以在复制时,必须清楚了解到:
a. 是否需要完整保留来源文件的信息?
b. 源文件是否为软连接文件(symbolic link file)?
c. 源文件是否为特殊的文件, 例如FIFO、socket等
d.源文件是否为目录?
rm(移除文件或目录)
语法: rm [-fir] 文件或目录
参数:
-f: 就是force的意思,忽略不存在的文件,不会出现警告信息。
-i: 互动模式, 在删除前会询问用户是否操作
-r: 递归删除。最常用在目录的删除。这是非常危险的参数
mv(移动文件与目录,或更名)
语法:mv [-fiu] source destination
mv [options] source1 source2 source3 ... directory
参数:
-f: force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖。
-i: 若目标文件(destination)已经存在时, 就会询问是否覆盖;
-u: 若目标文件已经存在,且source比较新,才会更新(update)
如果有多个源文件或目录,则最后一个目标文件一定是“目录”,意思是说,将所有的数据移动到该目录的意思。
另一个更改文件名的命令: rename
3、取得路径的文件名与目录名称: basename 和 dirname
如: basename /etc/sysconfig/network ---------> network
dirname /etc/sysconfig/network--------->/etc/sysconfig
三、文件内容查阅
cat: 由第一行开始显示文件内容。
tac: 从最后一行开始显示。可以看出tac是cat的倒写形式
nl: 显示的时候,顺便输出行号
more: 一页一页地显示文件内容
less: 与more类似,但是比more更好,可以往前翻页
head: 只看头几行
tail: 只看结尾几行
od: 以二进制的方式读取文件内容
1、直接查看文件内容:cat tac nl
cat(concatenate):
语法: cat [-AbEnTv]
参数: -A: 相当于-vET的整合参数, 可列出一些特殊字符,而不是空白而已。
-b: 列出行号,仅针对非空白行做行号显示,空白行不标行号
-E: 将结尾的断行字符$显示出来
-n: 打印出行号,连同空白行也会有行号,与-b的参数不同
-T: 将[Tab]按键以^I显示出来
-v: 列出一些看不出来的特殊字符。
tac(反向列示): cat是由“第一行到最后一行连续显示在屏幕上”,tac则是“由最后一行到第一行反向在屏幕上显示出来”
nl [-bnw] 文件 (添加行号打印):
参数:
-b : 指定行号指定的方式, 主要两种:
-b a: 表示不论是否为空行,也同样列出行号(类似cat -n)
-b t: 如果有空行,空的那一行不要列出行号(默认值)
-n: 列出行号表示的方法,主要有三种:
-n ln: 行号在屏幕的最左方显示
-n rn: 行号在自己字段的最右方显示,且不加0
-n rz: 行号在自己字段的最右方显示,且加0
-w: 行号字段占用的位数。
2、可翻页查看:more less
more(一页一页翻动):
如果more后面接的文件内容行数大于屏幕输出的行数时,最后一行就会显示目前显示的百分比,而且还可以在最后一行输入一些有用的命令。在more这个程序的运行过程中,你有几个按键可以按的:
空格键(Space): 代表向下翻一页
Enter: 代表向下滚动一行
/字符串 : 代表在这个显示的内容当中,向下查询“字符串”这个关键字
:f : 立刻显示出文件名以及目前显示的行数
q :代表立刻离开more,不再显示该文件内容
b或[ctrl]-b: 代表往回翻页,不过这操作只对文件有用,对管道无用
less(不只可以向下查询,也可以向上查询):
在less这个程序中,可以输入的命令有:
空格键: 向下翻动一页
[PageDown]: 向下翻动一页
[PageUp]: 向上翻动一页
/字符串 : 向下查询“字符串”的功能
?字符串: 向上查询“字符串”的功能
n: 重复前一个查询(与/或?有关)
N: 反向重复前一个查询(与/或?有关)
q: 离开less这个程序
3、数据选取:
head与tail都是以“行”为单位来进行数据选取
head(取出前面几行):
head [-n number] 文件
参数: -n 后面接数字,代表显示几行的意思
tail(取出后面几行):
tail [-n number] 文件
参数: -n: 后面接数字,代表显示几行的意思。
-f: 表示持续检测后面所接的文件名,要等到按下[ctrl]-c 才会结束tail的检测,要让文件有数据写入时就立刻显示到屏幕上,就利用-f这个参数
4、非纯文本文件: od
od [-t TYPE] 文件
参数:
-t: 后面可以接各种“类型 (TYPE)”的输出,例如:
a : 利用默认的字符来输出
c : 使用ASCII字符来输出
d[size]: 利用十进制(decimal)来输出数据, 每个整数占用size bytes
f[size]: 利用浮点数(floating)来输出数据,每个整数占用size bytes
o[size]: 利用八进制(octal)来输出数据,每个整数占用size bytes
x[size]: 利用十六进制(hexadecimal)来输出数据,每个整数占用size bytes
四、修改文件时间与创建新文件:touch
文件的三个时间:
modification time(mtime):
当该文件的“内容数据”更改时, 就会更新这个时间,内容数据指的是文件的内容,而不是文件的属性或权限。
status time(ctime):
当该文件的“状态”改变时, 就会更新这个时间。举例来说,像是权限与属性被更改了,都会更新这个时间。
access time(atime):
当“该文件的内容被取用”时, 就会更新这个读取时间(access)。举例来说,我们使用cat去读取文件,就会更新该文件的atime
默认情况下,ls显示出来的是该文件的mtime, 也就是这个文件的内容上次被更改的时间。
--time=atime 查看access time
--time=ctime 查看status time
touch [-acdmt] 文件
参数:
-a: 仅修改访问时间:
-c: 仅修改文件的时间,若该文件不存在则不创建新文件。
-d: 后面可以接欲修改的日期而不用目前的日期,也可以使用--date="日期或时间"
-m: 仅修改mtime;
-t: 后面可以接欲修改的时间而不用目前的时间,格式为[YYMMDDhhmm]
touch这个命令最常用的情况:
创建一个空的文件;
将某个文件日期修改为目前日期(mtime与atime)
五、文件与目录的默认权限与隐藏权限
1、文件默认权限: umask
umask 就是指定在新建文件或目录时候的权限默认值,代表拿走的权限:
查看方式有两种:
直接输入umask, 可以看到数字形态的权限设置分数。
一种则加入-S(Symbolic)这个参数,就会以符合类型的方式来显示出权限
umask会有四组数字,第一组是特殊权限用的,后面三项则是我们熟知的user group others的权限组。
要注意的是,umask的分数指的是“该默认值需要减掉的权限”。
例如umask 022, 所以user并没拿掉任何权限,不过group与others的权限被拿掉了2(也就是w这个权限),那么当用户:
新建文件时: (-rw-rw-rw-) - (-----w--w-) = (-rw-r--r--)
新建目录时:(drwxrwxrwx)- (d----w--w-) = (drwxr-xr-x)
umask [0002] 设置默认权限
默认情况下,root的umask会拿掉较多的属性,root的umask默认是022,这是局域安全的考虑,至于一般身份用户,通常他们的umask为002,即保留同用户组的写入权利。
2、文件隐藏属性chattr, lsattr
chattr (设置文件的隐藏属性):chattr命令只能在Ext2/Ext3的文件系统上面生效,其他的文件系统可能就无法支持这个命令了。
chattr [+-=] [ASacdistu] 文件或目录名称
参数:
+: 增加某一个特殊参数, 其他原本存在参数则不动。
-: 删除某一个特殊参数, 其他原本存在参数则不动。
=: 仅有后面接的参数
A: 当设置了A这个属性时, 若你有访问此文件(或目录)时, 他的访问时间atime将不会被修改,可避免I/O较慢的机器过度访问磁盘。这对速度较慢的计算机有帮助
S: 一般文件是异步写入磁盘的,如果加上S这个属性时, 当你进行任何文件的修改,该改动会“同步”写入磁盘中
a: 当设置a之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root才能设置这个属性。
c: 这个属性设置之后,将会自动将此文件压缩,在读取的时候将会自动解压缩,但是在存储的时候,将会先进行压缩后再存储(看来对大文件似乎蛮有用的)
d: 当dump程序被执行的时候,设置d属性将可使该文件(或目录)不会被dump备份。
i: 这个i可就很厉害了。它可以让一个文件“不能被删除、改名、设置连接也无写入或添加数据。”对于系统安全性有相当大的帮助。只有root能设置此属性“
s: 当文件设置了s属性时,如果这个文件被删除,他将会被完全从这个硬盘空间中删除
u: 与s相反, 当使用u来配置文件时, 如果该文件被删除了,则数据内容其实还存在于磁盘中,可以使用来找回该文件。
注: 属性设置常见的是a与i的设置值,而且很多设置值必须要身为root才能设置
lsattr [-adR] 文件或目录
参数:
-a: 将隐藏文件的属性也秀出来。
-d: 如果接的是目录,仅列出目录本身的属性而非目录内的文件名
-R: 连同子目录的数据也一并列出来
3、文件特殊权限:SUID, SGID, SBIT
Set UID(SUID):
当s这个标志出现在文件所有者的x权限上时,例如上面的/usr/bin/passwd权限“-rwsr-xr-x”,此时被称为Set UID, 简称为SUID的特殊权限。基本上SUID有这样的限制与功能:
a. SUID权限仅对二进制程序有效;
b. 执行者对于该程序需要具有x的可执行权限
c. 本权限仅在执行该程序的过程中(run-time)有效
d. 执行者将具有该程序所有者(owner)的权限
注: SUID仅可用在二进制程序上,不能够在shell script 上面, 且SUID对于目录也是无效的
Set GID(SGID):
s在用户组的x时则称谓SGID
与SUID不同,SGID可以针对文件或目录来设置。如果对于文件来说,SGID有如下的功能:
a. SGID对二进制程序有用
b. 程序执行者对于该程序来说,需具备x的权限
c. 执行者在执行的过程中将会获得该程序用户组的支持
对于目录来说, 有如下功能:
a. 用户若对于此目录具有r与x的权限时, 该用户能够进入此目录;
b. 用户在此目录下的有效用户组(effective group)将会变成该目录的用户组
c。若用户在此目录下具有w的权限(可以新建文件), 则用户所创建的新文件的用户组与此目录的用户组相同。
Sticky Bit(SBIT): t在其他人组的x时,称为SBIT, 目前前只针对目录有效,SBIT杜宇目录有以下功能:
a. 当用户对于此目录具有w,x权限,即具有写入的权限时:
b. 当用户在该目录下创建文件或目录时, 仅有自己与root才有权利删除该文件。
SUID/SGID/SBIT权限设置
数字形态更改权限的方式为“三个数字”的组合, 那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了
4为SUID
2为SGID
1为SBIT
如“chmod 4755 filename”---"-rwsr-xr-x"
也可以通过符号法来处理:其中SUID为u+s, 而SGID为g+s, SBIT则是o + t, 如下
chmod g+s, o+t test
4、查看文件类型:file
file 文件 --》 可以查看文件的基本数据,例如属于ASCII或者是data文件,或者是binary,且其中有没有使用到动态函数库(share library)等等信息。
六、命令与文件的查询:
1、脚本文件名的查询:
which或type查找命令放在哪里
which(寻找“执行文件”)
which [-a] command
-a: 将所有由PATH目录中可以找到的命令均列出来,而不是只第一个被找到的命令名称
2、文件名的查找:
whereis(寻找特定文件):
whereis [-bmsu] 文件或目录名
参数:
-b: 只找二进制格式的文件
-m : 只找在说明文件manual路径下的文件
-s: 只找source源文件
-u: 查找不在上述三个选项中的其他特殊文件
locate (关键字查找文件)
locate [-ir] keyword
-i: 忽略大小写的差异
-r: 后面可接正则表达式的显示方式
注意: locate: 依据/var/lib/mlocate内的数据库记载,找出用户输入的关键字文件名。 whereis也是一样的
如何更新数据库: 命令updatedb: 根据/etc/updatedb.conf的设置去查找系统硬盘内的文件名,并更新/var/lib/mlocate内的数据库文件。
find:
find [PATH] [option] [action]
参数:
1、与时间有关的参数: 共有 -atime, -ctime与-mtime, 下面以-mtime说明:
-mtime n : n位数字,意义为在n天之前的“一天之内”被更改过的文件
-mtime +n: 列出在n天之前(不含n天本身)被更改过的文件名
-mtime -n: 列出在n天之内(含n天本身)被更改过的文件名
-newer file: file 为一个存在的文件, 列出比file还要新的文件名
2、与用户或用户组名有关的参数:
-uid n: n为数字, 这个数字是用户的账号ID,即UID,这个UID是记录在/etc/passwd里面与账号名称对应的数字
-gid n: n 为数字, 这个数字是用户组名的ID,即GID,这个GID记录在/etc/group中
-user name: name 为用户账号名称,例如dmtsai
-group name: name为用户组名,例如users
-nouser: 寻找文件的所有者不存在/etc/passwd的人
-nogroup: 寻找文件的所有用户组不存在于/etc/group中的文件
当你自行安装软件时,很可能该软件的属性当中并没有文件所有者,这是可能的,在这个时候,就可以使用-nouser与-nogroup查找
3、 与文件权限即名称有关的参数:
-name filename: 查找文件名为filename的文件
-size [+-]SIZE: 查找比SIZE还要大(+)或小(-)的文件。这个SIZE的规格有:
c: 代表 byte, k: 代表 1024byte 所以要比50kb还要大的文件,就是“-size +50k”
-type TYPE: 查找文件的类型为TYPE的,类型主要有:一般正规文件(f)、设备文案(b,c)、目录(d)、连接文件(l)、socket(s)及FIFO(p)等属性
-perm mode : 查找文件权限“刚好等于”mode的文件,这个mode类似chmod的属性值,举例来说, -rwsr-xr-x的属性值为4755
-perm -mode : 查找文件权限“必须要全部包括mode的权限”的文件,举例来说,我们要查找-rwsr-xr-x,即0744的文件,使用-perm-0744,
当一个文件的权限为-rwsr-xr-x,即4755时,也会被列出来, 因为-rwsr-xr-x 的属性已经包括了-rwxr--r--的属性了。
-perm -mode : 查找文件权限“包含任意mode的权限”的文件,举例来说,我们查找-rwxr-xr-x, 即-perm +755时, 但一个文件属性为 -rw-------也会被列出来,因为他有-rw...的属性存在。
4、其他可进行的操作:
-exec command: command为其他命令, -exec后面可再接其他的命令来处理查找到的结果。
-pring : 将结果打印到屏幕上,这个操作是默认操作
例如: find / -perm +7000 -exec ls -l {} \;
{}代表的是“由find找到的内容”,如上图所示,find的结果会被放置到{}位置中
-exec 一直到“\;”是关键字,代表find额外命令的开始(-exec)到结束(\;),在这中间的就是find命令内的额外命令,在本例中就是“ls -l {}”
因为“;”在bash环境下是有特殊意义的,因此用反斜扛转义
find还可以利用通配符来找寻文件名
find不但可以指定查找的目录(连同子目录),并且可以利用额外的参数来找到最正确的文件名。
七、权限与命令间的关系(极重要)
1、进入目录成为“可工作目录”的基本权限:
可使用的命令: 例如cd等切换工作目录的命令
目录所需权限: 用户对这个目录至少需要具有x的权限
额外需求:如果用户想要在这个目录内利用ls查阅文件名,则用户对此目录还需要r的权限
2、用户在某目录内读取一个文件的基本权限:
可使用命令: cat more less 等
目录所需权限: 用户对这个目录至少需要具有x权限
文件所需要权限: 用户对文件至少需要具有r权限才行
3、让用户可以修改一个文件的基本权限:
可使用的命令: 例如nano或未来要介绍的vi编辑器等
目录所需权限: 用户在该文件所在的目录至少要有x权限
文件所需权限: 用户对该文件至少要有r,w权限
4、让一个用户可以创建一个文件的基本权限:
目录所需权限: 用户在该目录要具有w,x的权限,重点在w
5、让用户进入某目录并执行该目录下的某命令的基本权限
目录所需权限:用户在该目录至少要有x的权限
文件所需权限: 用户在该文件至少需要有x的权限