Linux文件与目录管理
文章目录
目录与路径
目录的相关操作
. 代表此层目录
… 代表上一层目录
- 代表前一个工作目录
- 代表“目前使用者身份”所在的主文件夹
~account 代表 account 这个使用者的主文件夹(account是个帐号名称)
无论在哪个目录中都存在:“.”,“…”这两个目录,分别代表本层与上一层的含义
在根目录中也存在 ”.“ ,“…” 这个两个目录,但这是两个目录的属性和权限一模一样,代表这是同一目录
常见处理目录的指令:
cd:变换目录
pwd:显示目前的目录(print working directory)
-P:会不以链接文件的数据显示,而是显示正确的完整路径
mkdir:创建一个新的目录
-m:设置文件的权限,而不使用默认umask的权限
-P:帮助你直接将所需要的目录(包含上层目录)递回创建起来
意思就是系统不能帮你连续创建类似 /test1/test2/test3/test4,但你使用-P指令就可以连续创建1234目录
rmdir:删除一个“空的”目录
-P:连同上层空的目录一同删除
-r:连同该目录和目录下的文件一块删除
Linux的默认命令行界面,具有文件补齐功能,使用[tab]按键来达成文件补齐
关于可执行文件路径的变量:$PATH
为什么在终端的任何情况下都可以使用 ls 这一个指令呢,因为是环境变量PATH的帮助所导致,分别查看PATH的设置路径
使用echo指令:
PATH这个变量的内容是由于一堆路径所构成,中间使用的:号隔开,无论在root或者用户模式下,都有/bin和/usr/bin这个目录存在,所以可以在任何地方使用ls指令
但是当我有两个ls指令在不同的目录,例如/usr/local/bin/ls与/bin/ls,那么当我下达ls指令时,哪个ls会率先执行?
答:使用echo查找${PATH}里面哪个目录先被查询,则那个目录的指令就会被率先执行。所以我使用的账号是erskine,最先搜索出来的是/usr/local/bin,所以/usr/local/bin/ls就会被先执行
-
不同身份使用者默认的PATH不同,默认能够随意执行的指令也不同(如root与
account);
-
PATH是可以修改的;
-
使用绝对路径或相对路径直接指定某个指令的文件名来执行,会比搜寻PATH来的正确;
-
指令应该要放置到正确的目录下,执行才会比较方便;
-
本目录(.)最好不要放到PATH当中。
文件与目录管理
文件与目录的检视:ls
-a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用)
-A :全部的文件,连同隐藏文件,但不包括 . 与 … 这两个目录
-d :仅列出目录本身,而不是列出目录内的文件数据(常用)
-f :直接列出结果,而不进行排序 (ls 默认会以文件名排序!)
-F :根据文件、目录等信息,给予附加数据结构,例如:
*:代表可可执行文件; /:代表目录; =:代表 socket 文件; |:代表 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} :输出 access 时间或改变权限属性时间 (ctime)
而非内容变更时间 (modification time)
通常情况下 ll 就相当于 ls -l的功能
复制、删除于移动:cp,rm,mv
- cp(复制文件或目录)
[root@study ~]# cp [-adfilprsu] 来源文件(source) 目标文件(destination)
[root@study ~]# cp [options] source1 source2 source3 … directory
选项与参数:
-a :相当于 -dr --preserve=all 的意思,至于 dr 请参考下列说明;(常用)
-d :若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身;
-f :为强制(force)的意思,若目标文件已经存在且无法打开,则移除后再尝试一次;
-i :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l :进行硬式链接(hard link)的链接文件创建,而非复制文件本身;
-p :连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用);
-r :递回持续复制,用于目录的复制行为;(常用)
-s :复制成为符号链接文件 (symbolic link),亦即“捷径”文件;
-u :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制。
–preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了。
最后需要注意的,如果来源文件有两个以上,则最后一个目的文件一定要是“目录”才行!
如果要去复制别人的文件,则该文件必须有read的权限才可以,并且一般来说复制的文件和源文件的权限是不同的,复制的文件的使用者往往是操作复制的人;
所以在我们进行备份的时候,若要复制特殊权限文件,例如密码档或者一些配置文件,不能直接用cp进行复制,而是使用cp -a或者-p 可以完整的复制文件的权限和属性
如果是目录则不能直接复制,要加上 -r 的选项,但是权限还是会修改
在复制时,必须要清楚:
是否需要完整的保留来源文件的信息?
来源文件是否为链接文件 (symbolic link file)?
来源文件是否为特殊的文件,例如 FIFO, socket 等?
来源文件是否为目录?
- rm(移除文件或者是目录)
[root@study ~]# rm [-fir] 文件或目录
选项与参数:
-f :就是 force 的意思,忽略不存在的文件,不会出现警告讯息;
-i :互动模式,在删除前会询问使用者是否动作
-r :递回删除啊!最常用在目录的删除了!
使用万用字符 * 的帮忙,代表的是0到无穷多个任意字符
在删除目录时,若目录中没有文件则要使用rmdir指令,若目录中有文件就要使用rm -r
- mv(移动文件与目录,或者更名)
[root@study ~]# mv [-fiu] source destination
[root@study ~]# mv [options] source1 source2 source3 … directory
选项与参数:
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u :若目标文件已经存在,且 source 比较新,才会更新 (update)
该指令也可以用来修改名称
取得路径的文件名称与目录名称
[root@study ~]# basename /etc/sysconfig/network
network <== 很简单!就取得最后的文件名~
[root@study ~]# dirname /etc/sysconfig/network
/etc/sysconfig <== 取得的变成目录名了!
文件内容查询
直接检视文件内容:cat tac nl
cat 由第一行开始显示文件内容
[root@study ~]# cat [-AbEnTv]
选项与参数:
-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E :将结尾的断行字符 $ 显示出来;
-n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;
-T :将 [tab] 按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符
tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
nl 显示的时候,顺道输出行号!
[root@study ~]# nl [-bnw] 文件
选项与参数:
-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认值);
-n :列出行号表示的方法,主要有三种:
-n ln :行号在屏幕的最左方显示;
-n rn :行号在自己字段的最右方显示,且不加 0 ;
-n rz :行号在自己字段的最右方显示,且加 0 ;
-w :行号字段的占用的字符数。
可检视翻页:more less
more 一页一页的显示文件内容
空白键 (space):代表向下翻一页;
Enter :代表向下翻“一行”;
/字串 :代表在这个显示的内容当中,向下搜寻“字串”这个关键字;
:f :立刻显示出文件名以及目前显示的行数;
q :代表立刻离开 more ,不再显示该文件内容。
b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。
less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
空白键 :向下翻动一页;
[pagedown]:向下翻动一页;
[pageup] :向上翻动一页;
/字串 :向下搜寻“字串”的功能;
?字串 :向上搜寻“字串”的功能;
n :重复前一个搜寻 (与 / 或 ? 有关!)
N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
g :前进到这个数据的第一行去;
G :前进到这个数据的最后一行去 (注意大小写);
q :离开 less 这个程序;
数据摘取:head tail
head 只看头10行
head -n 20 xxx可以显示前20行的内容
tail 只看尾巴10行
tail -n 20 同理
非纯文本文件:od
od 以二进制的方式读取文件内容
[root@study ~]# 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
其中三个时间参数:
mtime:指的是文件内容修改的最后时间
ctime:指的是文件权限修改的最后时间
atime:指的是文件被取用的最后时间(例如cat)
在默认的情况下:ls显示出来的时间戳是mtime
[root@study ~]# touch [-acdmt] 文件
选项与参数:
-a :仅修订 access time;
-c :仅修改文件的时间,若该文件不存在则不创建新文件;
-d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date=“日期或时间”
-m :仅修改 mtime ;
-t :后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm]
文件与目录的默认权限与隐藏权限
文件与目录的权限除了rwx以及是什么文件的属性之外,还了解了修改文件权限的chmod、chgrp、chown。
Linux在传统的Ext2/Ext3/Ext4文件系统下,还可以设置其他的文件属性(使用chattr设置隐藏属性,使用lsattr来查看)。
但是在xfs文件系统下的就没有支持chattr的参数了
练习:
- 你的系统有个一般身份使用者 dmtsai,他的群组属于 dmtsai,他的主文件夹在/home/dmtsai, 你是root,你想将你的 ~/.bashrc 复制给他,可以怎么做?
首先我是root,我的系统下有个文件.bashrc,然后复制给我的用户dmtsai的家目录下,就要用到cp
cp ~/.bashrc ~dmtsai/bashrc
然后因为cp不会修改权限,所以文件默认还是root用户,群组也是root,所以我们就要修改属性
chown dmtsai:dmtsai ~dmtsai/bashrc
用户dmtsai的家目录可以写做:~dmtsai
dmtsai:dmtsai表示使用和群组,之间用:隔开
-
我想在 /tmp 下面创建一个目录,这个目录名称为 chapter6_1 ,并且这个目录拥有者
为 dmtsai, 群组为 dmtsai,此外,任何人都可以进入该目录浏览文件,不过除了 dmtsai 之
外,其他人都不能修改该目录下的文件。
创建目录:mkdir -m 755 /tmp/chapter6_1
mkdir -m u+w,a+r,a+x, /tmp/chapter6_1 这个没用,群组也还是会访问
修改属性:chown dmtsai:dmtsai /tmp/chapter6_1
文件默认权限:umask
使用umask -S指令来查看,虚拟机下的文件默认权限:
可以看出umask的掩码为002,(一般只看最后三位)
也就是说:
当文件创建时默认为:666(rw-rw-rw-普通文件没有x权限)- 002 = 664:rw-rw-r–
当目录创建时默认为:777(rwxrwxrwx)- 002 = 775:rwxrwxr-x
如何修改umask呢: 直接输入umask xxx就可以
文件隐藏属性
下面的chattr指令只能在Ext2/Ext3/Ext4的 Linux 传统文件系统上面完整生效, 其他的文件系统可能
就无法完整的支持这个指令了,例如 xfs 仅支持部份参数而已。
文件特殊权限:SUID,SGID,SBIT
发现本该时x权限的竟然是 s,t权限,这是啥意思呢
我们知道/usr/bin/passwd的权限是root用户使用,但是account可以使用吗,答案是当然可以,因为我们有s权限,可以暂时使account获得root的权限从而修改密码。所以这个s就代表这SUID的功能:
SUID 权限仅对二进制程序(binary program)有效;
执行者对于该程序需要具有 x 的可执行权限;
本权限仅在执行该程序的过程中有效 (run-time);
执行者将具有该程序拥有者 (owner) 的权限。
有些s存在于使用者的x权限位置,但有些s存在于群组的x权限位置,例如:
,那 s 在群组的 x 时则称为 Set GID, SGID
与 SUID 不同的是,SGID 可以针对文件或目录来设置
对于文件来说SGID具有如下的功能
SGID 对二进制程序有用;
程序执行者对于该程序来说,需具备 x 的权限;
执行者在执行的过程中将会获得该程序群组的支持!
若我使用 erskine 这个帐号去执行 locate 时,那 erskine 将会取得slocate 群组的支持, 因此就能够去读取 mlocate.db
对于目录来说SGID具有如下的功能
使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文
件,该新文件的群组与此目录的群组相同。
SBIT是针对目录来使用的
当其他人的x位置权限更改成t时,称为SBIT权限
当使用者对于此目录具有 w, x 权限,亦即具有写入的权限时;
当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件
例如:在/tmp的目录属性为 “drwxrwxrwt”,表示原来任何人可以都可以在该目录下添加和修改文件,但是,现在有t了,只能由本用户还有老大root来修改和删除本用户的文件和目录感觉就是变得更加的规范喽
如何设置SUID、SGID、SBIT呢
和权限数字更改差不多
SUID 4
SGID 2
SBIT 1
-
若要设置 -rwsr-xr-x时,由于s在使用者权限中,所以时SUID,以前的权限是755,现在修改后就是4755,所以就是chmod 4755 filename
-
而除了数字法之外,你也可以通过符号法来处理喔!其中 SUID 为 u+s ,而 SGID 为 g+s ,
SBIT 则是 o+t
大写的S,T则是代表没有x的权限位,以前本身就没有x权限就更别提设置成s,t了
就像这样 0.o
观察文件类型:file
若你想要观察文件是什么类型的文件(ASCII、data、binary)
或者其中有没有用到动态函数库等等信息,就可以使用file
也可以拿来去判断是哪种格式的压缩包:
指令与文件的搜寻
指令的搜寻
类似于ls等指令的搜寻,我们可以查找ls被放在哪个文件夹里,通常我们使用which和type来搜寻
- which(寻找 可执行文件)
-a 可将所有包含该指令的文件统统列出来,而不只是第一个被找到的指令
有些指令通过例如history,通常which找不到,因为history是“bash 内置的指令”
which默认的是寻找PATH内所规范的目录
文件名的搜索
- whereis(由一些特定的目录中寻找文件文件名)
whereis主要是针对/bin/sbin下面的可执行文件
以及/usr/share/man下面的man page文件
[root@study ~]# whereis [-bmsu] 文件或目录名
选项与参数:
-l :可以列出 whereis 会去查询的几个主要目录而已
-b :只找 binary 格式的文件
-m :只找在说明文档 manual 路径下的文件
-s :只找 source 来源文件
-u :搜寻不在上述三个项目当中的其他特殊文件
对于find来说是直接搜寻硬盘
- locate/updatedb
locate 寻找的数据是由“已创建的数据库 /var/lib/mlocate/” 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据
[root@study ~]# locate [-ir] keyword选项与参数:
-i :忽略大小写的差异;
-c :不输出文件名,仅计算找到的文件数量
-l :仅输出几行的意思,例如输出五行则是 -l 5
-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r :后面可接正则表达式的显示方式
撰写不易,留下您的关注和点赞,我们一起进步!