Linux 文件与目录管理

Linux 文件与目录管理

目录与路径

相对路径与绝对路径

  • 绝对路径:绝对路径的写法一定由根目录(/)写起
  • 相对路经:路径的写法不是由根目录写起(/) 相对路经比较简洁,而绝对路径的正确对要比较好

目录的相关操作

比较特殊的目录

目录名 含义
. 代表当前目录
.. 代表上层目录
- 代表前一个工作目录
~ 代表 目前用户身份 所在的家目录
~account 代表account 这个用户的家目录

在所有的目录下都会有两个目录,跟别是 . 和 .. 常用的处理目录的指令:

  • cd:变更目录
  • pwd:显示当前目录 pwd -P 显示正确的目录名,而不是以链接文件的目录显示

  • mkdir:建立一个新的目录

    [root@centos764 ~]# mkdir [-mp] 目录名称 选项与参数: -m :配置目录的权限,直接设定,不需要看预设权限(umask) -p :帮助你直接将所需要的目录(包含上层目录)递归建立

  • rmdir:删除一个空的目录

    [root@study ~]# rmdir [-p] 目录名称 选项与参数: -p :连同上层空的目录也一起删除

文件与目录管理

文件与目录的检视:ls

命令格式:

[root@study ~]# ls [-aAdfFhilnrRSt] 文件名或目录名称.. 
[root@study ~]# ls [--color={never,auto,always}] 文件名或目录名称.. 
[root@study ~]# ls [--full-time] 文件名或目录名称.. 
选项与参数: 
-a  :全部的文件,连同隐藏档( 开头为 . 的文件) 一起列出来(常用)
-A  :全部的文件,连同隐藏档,但不包括 . 与 .. 这两个目录 
-d  :仅列出目录本身,而不是列出目录内的文件数据(常用) 
-f  :直接列出结果,而不进行排序 (ls 预设会以档名排序!) 
-F  :根据文件、目录等信息,给予附加数据结构,例如:       
     *:代表可执行文件; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件; 
-h  :将文件容量以人类较易读的方式(例如 GB, KB 等等)列出来; 
-i  :列出 inode 号码; 
-l  :长数据串行出,包含文件的属性与权限等等数据;(常用) 
-n  :列出 UID 与 GID 而非使用者与群组的名称 
-r  :将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小; 
-R  :连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来; 
-S  :以文件容量大小排序,而不是用档名排序; 
-t  :依时间排序,而不是用档名。 
--color=never  :不要依据文件特性给予颜色显示; 
--color=always :显示颜色 
--color=auto   :让系统自行依据设定来判断是否给予颜色 
--full-time    :以完整时间模式 (包含年、月、日、时、分) 输出 
--time={atime,ctime} :输出 access 时间或改变权限属性时间 (ctime)而非内容变更时间 (modification time) 

复制、删除与移动: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 等也复制了。 最后需要注意的,如果来源档有两个以上,则最后一个目的文件一定要是『目录』才行!

如果有链接文件,会默认复制文件本身,不是链接文件,要注意参数 -d -a 参数只有root用户使用时才能完全复制属性,其他用户可能失败

rm (移除文件或目录)

命令格式:

[root@study ~]# rm [-fir] 文件或目录 
选项与参数: 
-f  :就是 force 的意思,忽略不存在的文件,不会出现警告讯息; 
-i  :互动模式,在删除前会询问使用者是否动作 
-r  :递归删除!最常用在目录的删除了!这是非常危险的选项!!!

如果有以 - 开头的文件,假设为 -test 则删除方式为:rm ./-test

mv(移动文件与目录或更名)

命令格式:

[root@study ~]# mv [-fiu] source destination 
[root@study ~]# mv [options] source1 source2 source3 .... directory 
选项与参数: 
-f  :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖; 
-i  :若目标文件 (destination) 已经存在时,就会询问是否覆盖! 
-u  :若目标文件已经存在,且 source 比较新,才会更新 (update) 

更名的用法:mv 1.txt 2.txt ,1.txt在当前目录且当前目录下无2.txt 注意的是移动目录和移动文件相同,不用添加额外参数就能将目录同目录内文件移动

取得路径的文件名与目录名称

  • basename:取得最后文件名,用法: [root@study ~]# basename /etc/sysconfig/network network
  • dirname:取得文件的目录名,用法: [root@study ~]# dirname /etc/sysconfig/network /etc/sysconfig

这两个命令主要用于 shell scripts中

文件内容查阅

文件查阅命令主要如下:

  • cat 由第一行开始显示全部的文件内容
  • tac 由最后一行开始倒序显示全部文件内容,是 cat 的倒序
  • nl 显示的时候输出行号
  • more 一页一页显示文件内容
  • lessmore 类似,但是可以往前翻页
  • head 只看头几行
  • tail 只看末尾几行
  • od 以二进制方式读取文件内容

直接查看文件内容

直接查看文件内容可以使用 cattacnl 命令,这些指令一般处理内容量较少的文件,内容量太大,不易阅读

  • cat 指令格式 [root@study ~]# cat [-AbEnTv] 文件 选项与参数: -A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已; -b :列出行号,仅针对非空白行做行号显示,空白行不标行号! -E :(End)将结尾的断行字符 $ 显示出来; -n :打印出行号,连同空白行也会有行号,与 -b 的选项不同; -T :(Tab)将 [tab] 按键以 ^I 显示出来; -v :列出一些看不出来的特殊字符
  • tac 指令格式与 cat 指令格式相同
  • nl 指令格式: [root@study ~]# nl [-bnw] 文件 选项与参数: -b :指定行号指定的方式,主要有两种: -b a :表示不论是否为空行,也同样列出行号(类似 cat -n); -b t :如果有空行,空的那一行不要列出行号(默认值); -n :列出行号表示的方法,主要有三种: -n ln :行号在屏幕的最左方显示;(l代表left) -n rn :行号在自己字段的最右方显示,且不加 0 ; (r代表right) -n rz :行号在自己字段的最右方显示,且加 0 ; -w :行号字段的占用的字符数。

    zzz@Ubuntu:/tmp/learn$ nl 1.txt 1 i'm zzz 2 welcome to here 3 we will learn together zzz@Ubuntu:/tmp/learn$ nl -n ln 1.txt 1 i'm zzz 2 welcome to here 3 we will learn together zzz@Ubuntu:/tmp/learn$ nl -n rn 1.txt 1 i'm zzz 2 welcome to here 3 we will learn together zzz@Ubuntu:/tmp/learn$ nl -n rz 1.txt 000001 i'm zzz 000002 welcome to here 000003 we will learn together zzz@Ubuntu:/tmp/learn$ nl -n rz -w 3 1.txt 001 i'm zzz 002 welcome to here 003 we will learn together

可翻页查看

可翻页查看的指令有 more less more 中可输入按键:

按键 作用
空格键(space) 向下翻一页
Enter 向下翻一行
/字符串 在当前显示内容中,向下搜素 字符串 这个关键词
:f 立即显示文件名以及目前显示的行数(注意输入的时候屏幕不显示: 与 f)
q 立即离开more
b 或 [ctrl + b] 往回翻页,仅对文件有效,对管道无效

less 中可输入按键

按键 作用
空格键(space) 向下翻动一页
[pagedown] 向下翻动一页
[pageup] 向上翻动一页
/ 字符串 向下搜索 字符串
? 字符串 向上搜索 字符串
n 重复的前一个搜索
N 方向重复前一个搜索
g 跳转到文件的第一行
G 跳转到文件的最后一行
q 离开 less 这个程序

man 命令就是使用的 less

资料撷取

取出文件前几行(head) 或者取出文件后几行(tail),headtail 都是以行为单位进行撷取

  • head 取出前面几行 指令格式: [root@study ~]# head [-n number] 文件 选项与参数: -n :后面接数字,代表显示几行的意思 默认显示前十行,如果是 head -n 负数 文件 那么显示的是从末尾去除负数的绝对值行后的内容
  • tail 取出前面几行 指令格式与 head 相同,不过在 head 里面 number 不带符号 与带负号的含义相同,如果带正号的话,则显示去除前 number 行的内容。

修改文件时间或建立新文件:touch

文件的三个时间:

  • modification time(mtime):当文件的 内容数据 变更时就会更新这个时间,内容数据指的是文件的内容而不是文件的属性或权限
  • status time(ctime):(也有说是change time)当文件的 状态 改变时就会更新这个时间,例如文件的权限或属性改变就会更新这个时间
  • access time(atime):当 文件的内容被取用时,就会更新这个时间,例如 cat filename

ls -l 指令默认显示文件的 mtime,使用参数 --time=atime 或 --time=ctime 来改变显示 需要注意的是 mtime 变 ctime 一定变;vim 一个文件 即使你没有修改文件内容,但采用 wq 命令离开,此时 mtime 也会改变;如果采用 q 方式离开文件的ctime,atime,mtime都不会变。

touch 指令的作用:

  • 建立一个空文件
  • 修改文件的 mtime 和 atime

文件的时间很重要,如果时间误判某些程序会无法正常工作,touch 指令可以将来自未来的文件修改成现在时间(不同地区有时差)

touch 命令格式:

[root@study ~]# touch [-acdmt] 文件 
选项与参数: 
-a  :仅修订 access time; 
-c  :仅修改文件的时间,若该文件不存在则不建立新文件; 
-d  :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间" 
-m  :仅修改 mtime ; 
-t  :后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm]

在Ubuntu 16中测试得到无论修改atime还是修改mtime,ctime都会随着改变。 另外,复制一个文件,复制所有属性,但是也没法复制ctime这个属性

文件的与目录的默认权限与隐藏权限

文件预设权限:umask

umask 指的是 建立新的文件或目录时的权限默认值

  • 文件的预设权限为 -rw-rw-rw-
  • 目录的预设权限为 drwxrwxrwx

直接执行umask命令,会显示四个数字,第一个数字与特殊权限有关,后三个数字与user,group,others权限有关,意义是 预设权限需要减掉的权限。

[root@study ~]# umask 
0022

建立文件的默认权限为:(-rw-rw-rw-) - (- - - - -w- -w-) = -rw-r--r-- 建立目录的默认权限为:(drwxrwxrwx) - (d- - - -w- -w-) = drwxr-xr-x

临时修改umask值两种方法:

  • umask 0022
  • umask u=,g=w,o=w

Ubuntu中预设umask 为0002,CentOS中预设为0022,所以在组内合作开发时,CentOS用户需要将umask修改为0002。

文件隐藏属性

配置文件的隐藏属性的命令为chattr,但chattr命令只能在Ext2/Ext3/Ext4的Linux的传统文件系统上生效,在 xfs 中仅支持部分参数。 chattr配置文件的隐藏属性: 命令格式:

[root@study ~]# chattr [+-=][ASacdistu] 文件或目录名称 
选项与参数: 
+   :增加某一个特殊参数,其他原本存在参数则不动。 
-   :移除某一个特殊参数,其他原本存在参数则不动。 
=   :设定一定,且仅有后面接的参数 

A  :当设定了 A 这个属性时,若你有存取此文件(或目录)时,他的访问时间 atime 将不会被修改,      可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目) 
S  :一般文件是异步写入磁盘的,如果加上 S 这个属性时,当你进行任何文件的修改,该更动会『同步』写入磁盘中。 
a  :当设定 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有 root 才能设定这属性 
c  :这个属性设定之后,将会自动的将此文件『压缩』,在读取的时候将会自动解压缩,但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎有用) 
d  :当 dump 程序被执行的时候,设定 d 属性将可使该文件(或目录)不会被 dump 备份 
i  :可以让一个文件『不能被删除、改名、设定连结也无法写入或新增数据!』,对于系统安全性有相当大的帮助!只有 root 能设定此属性 
s  :当文件设定了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间,      所以如果误删了,完全无法救回来了喔! 
u  :与 s 相反的,当使用 u 来配置文件案时,如果该文件被删除了,则数据内容其实还存在磁盘中,      可以使用来救援该文件喔! 

注意 1:属性设定常见的是 a 与 i 的设定值,而且很多设定值必须要身为 root 才能设定 注意 2:xfs 文件系统仅支援 AadiS 而已 注意 3:新建文件时目录的隐藏权限会传递给新文件

chattr设定的隐藏属性不能被 ls显示出来,只能通过lsattr显示出来。 lsattr 显示文件隐藏属性: 命令格式:

[root@study ~]# lsattr [-adR] 文件或目录 
选项与参数: 
-a :将隐藏文件的属性显示出来; 
-d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名; 
-R :连同子目录的数据也一并列出来

文件特殊权限:SUID,SGID,SBIT

Set UID

s 这个标志出现在文件拥有者x 权限上时,例如-rwsr-xr-x ,此时称为 Set UID简称SUID,SUID功能与限制:

  • SUID 权限仅对二进制程序(binary program)有效
  • 执行者需要对该程序有有 x 的可执行权限
  • 本权限仅在该程序的过程中有效(run-time)
  • 执行者将具有该程序的拥有者(owner)的权限

注意:SUID仅可用在 binary program 上,不能用在 shell script上。SUID 对目录无效。 SUID的一个例子:

普通用户能够修改自己的密码,而密码是存储在 /etc/shadow 中,/etc/shadown 的权限为 -rw-r----- 1 root shadow 1036 Sep 9 20:25 /etc/shadow (Ubuntu中),普通用户没有修改该文件的权限,那么普通使用户是怎么修改密码的呢?因为修改密码的命令passwd 的权限为 -rwsr-xr-x 1 root root 54256 May 17 2017 /usr/bin/passwd ,有 s 权限,所有普通用户使用passwd命令的时候(run-time)就具有 root 的权限,也就能修改/etc/shadow文件,进而修改密码。

Set GID

s 这个标志出现在群组x 权限上时,例如-rwx--s--x ,此时称为 Set GID简称SGID,SGID 与 SUID不同,SGID可以既可以设置在文件上又可以设置在目录上。

设置在文件上来说:

  • SGID 对二进制程序有用
  • 程序的执行者对该程序具有 x 权限
  • 执行者在执行的过程中可以获得该程序群组的支持

举例:

zzz@Ubuntu:~$ ls -l /usr/bin/mlocate  /var/lib/mlocate/mlocate.db 
-rwxr-sr-x 1 root mlocate   39520 Nov 18  2014 /usr/bin/mlocate
-rw-r----- 1 root mlocate 3027846 Sep 10 06:25 /var/lib/mlocate/mlocate.db

使用locate 命令时会读取 /var/lib/mlocate/mlocate.db,这个mlocate文件的的群组有 s 权限,所以普通用户使用locate 命令时,具有群组 mlocate 的权限,也就能够 读取(r) /var/lib/mlocate/mlocate.db 文件。

设置在目录上来说:

  • 用户若对目录具有r、x权限,则用户能够进入此群组
  • 用户在此目录中的有效群组(effective group)会变成该目录的群组。(临时改变有效群组的命令为 newgrp)。
  • 用途:若用户在此目录下具有 w 权限,则使用者新建的文件的群组与目录群组相同。

Sticky Bit

Sticky Bit(SBIT) 仅对目录有效,起作用是:当用户对此目录具有w,x权限时:用户在此目录下建立文件或目录时,仅有自己与root权利删除该文件。一般位于 others 权限上。

换句话说:当甲这个用户于 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表 示『甲用户对该目录内任何人建立的目录或文件均可进行 "删除/更名/搬移" 等动作。』 不过,如果 将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己建立的文件或目录进行删除/更名/移动 等动作,而无法删除他人的文件

SUID/SGID/SBIT 权限设定

在普通数字型的权限设定前面加个数字便是对特殊权限的设定,数字的含义如下表:

数字 权限
4 SUID
2 SGID
1 SBIT

例: 将 test.txt 设定为 -rwsr-xr-x,则执行命令 chmod 4755 test.txt 也可用字符法:chmod u=rwxs,go=rx test.txt

注意:如果 ls -l 命令之后有 S 、T说明s、t权限设定无效,因为文件的拥有者/群组没有 x 或 r、x 或 w、x 权限。

观察文件类型:file

执行命令file filename便可查看文件的类型,可以查看 tar包使用的那哪种压缩功能。

指令与文件的搜索

脚本文件名的搜索

使用 whichtype 来查询指令文件的完整文件名

  • which 指令是根据 PATH 这个环境变量所规范的路径,去搜寻执行文件的文件名。 例:查询ls 命令的完整文件名 zzz@Ubuntu:~$ which ls /bin/ls
  • type 命令用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令
  • 内部指令是shell程序的一部分,驻留在内存中,运行速度快
  • 外部指令在硬盘中,运行速度较慢 例:查询 history命令: zzz@Ubuntu:~$ type history history is a shell builtin

文件名的搜索

通常用 whereis 命令和 locate 命令,不常用 find 命令,因为 find 在磁盘中查询,命令查询速度慢。

  • whereis 命令,在一些特定的目录中寻找文件文件名,需要完整的文件名 [root@study ~]# whereis [-bmsu] 文件或目录名 选项与参数: -l :可以列出 whereis 会去查询的几个主要目录 -b :只找 binary 格式的文件 -m :只找在说明文件 manual 路径下的文件 -s :只找 source 来源文件 -u :搜寻不在上述三个项目当中的其他特殊文件
  • locate 命令,由文件名的一部分查找,查找速度较快,locate 寻找的数据是由以建立的数据库/var/lib/mlocate/ 中搜寻的 [root@study ~]# locate [-ir] keyword 选项与参数: -i :忽略大小写的差异; -c :不输出档名,仅计算找到的文件数量 -l :仅输出几行的意思,例如输出五行则是 -l 5 -S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等 -r :后面可接正规表示法的显示方式 可以手动更新查询数据库 updatedb(根据/etc/updatedb.conf设定搜寻系统硬盘内文件名并更新数据库),耗时较长。
  • find 名令,在硬盘中搜索 ``` [root@study ~]# find [PATH] [option] [action] 选项与参数:
  • 与时间有关的选项:共有 -atime, -ctime 与 -mtime ,以 -mtime 说明
    -mtime n :n 为数字,意义为在 n 天之前的『一天之内』被更动过内容的文件;
    -mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件档名;
    -mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件档名。
    -newer file :file 为一个存在的文件,列出比 file 还要新的文件档名 `` 范例:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出find / -mtime 0那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前,有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内?find / -mtime 3 ` 有变动过的文件都被列出的意思!

发表评论

评论列表,共 0 条评论

    暂无评论