Linux基础(3) - 文件与目录

Linux中文件和目录管理

文件这一块需要掌握常用命令非常多

也是Linux基础中非常关键的一环

这一块可以说是基础中重中之重了,具体的思维导图如下。



1、cd 切换目录

cd 是change directory的缩写,表示切换工作目录

格式:cd【相对路径/绝对路径】

绝对路径:一定从根目录开始的路径,比如/usr/share/doc 这个目录

相对路径:不是由根目录写起的,指的是相对当前工作目录的路径,比如由 /usr/share/doc 到/usr/share/man 下面时,可以写成“cd../man”

一般来讲,写绝对路径正确度要高些。下面是一些相对路径的表示方式,表示比较特殊的目录

命令 含义
. 代表此层目录
.. 代表上一层目录
- 代表前一个目录
~ 代表当前用户身份所在的文件夹
~acount 代表acount这个用户所在的文件夹(acount是账户名称)

下面就是比较特殊的命令了,比较有意思的是cd -cd .. 这两个。

命令 含义
cd 回到自己的主文件夹
cd ~ 回到自己的主文件夹
cd .. 去到上一层目录
cd - 回到这一步之前的目录(就是相当于回退一步)
cd /var/spool/mail 绝对路径的写法,指定要去的完整路径的名称
cd ../mqueue 相对路径的写法,由前面的/var/spool/mail去到/var/spool/mqueue

具体实现如图所示


2、pwd 显示当前目录

pwd是print working directory的缩写,显示目前所在目录

格式:pwd [-P]

具体实现如图所示,-P参数可以帮助我们获得正确的目录名称,而不是连接文件的路径


3、mkdir 新建新目录

mkdir是 make directory 的缩写

格式:mkdir [-mp] 【目录名称】

参数:

  • -m: 可以直接在创建时配置文件权限,无需看默认权限
  • -p: 可以递归创建所需目录(默认情况下目录是一层一层创建)

具体实现如图所示,可以看到,没有给予-m参数时,默认新建目录权限为 rwx rwx r-x(775)


4、rmdir 删除目录

格式: rmdir [-p] 【目录名称】

参数:

  • -p: 连同上一层的空目录也一起删除

具体实现如下图所示,一般来说用单独的rmdir命令删除,仅仅能一层一层的删除,并且被删除目录里面必定不能含有其它的目录或文件(除非用rm -r finename)


5、ls 查看文件与目录

格式:ls [-aAdfFhilnrRSt]【目录名称】

参数:

  • -a: 列出全部文件,连同隐藏文件(开头为 . 的文件) ,一起列出来(常用)
  • -l: 列出长串数据,包括文件属性、文件权限等数据(常用)
  • -d: 仅仅列出目录本身,而不是列出目录的文件数据(常用)
  • 其它太多了,暂且略过

具体例子如图下所示,ls -l ~ 表示将主文件夹下的所有文件全部列出来


6、touch创建新文件(或修改文件时间)

每个文件在linux下面都会记录很多时间参数,其中有三个主要变动时间

  • mtime(modification time): 当文件内容数据更改时,会更新这个时间。内容数据指的是文件的内容,而不包括文件的属性或权限
  • ctime(status time): 当文件的状态改变时,会更新这个时间。例如文件的属性或权限发生改变时,会更新这个时间。
  • atime(access time): 当文件内容被取用时,会更新这个时间。例如我们使用cat查看/etc/man.config,就会更新文件的atime

如图所示,可以看出,默认情况下,ls显示的是文件的mtime(也就是该文件内容上次被修改的时间)

格式:touch [-acdmt] 【文件】
参数:

  • -a: 仅修改访问时间(即atime)
  • -m: 仅修改文件mtime
  • -c: 仅修改文件的时间,若文件不存在,则不创建新文件夹
  • -d: 后面可以接欲修改的时间,而不用目前的时间,也可以使用–date=”日期或时间”
  • -t:后面可以接欲修改的时间,而不用目前的时间,格式为[YYMMDDhhmm]

​默认情况下,如果touch后面接有文件(文件已经存在),则该文件的三个时间(atime,ctime,mtime)都会更新为目前时间;若文件不存在,会主动创建一个新的空文件,文件大小为0. 如下图所示。


7、cp复制文件/目录

cp为copy的缩写,cp除了单纯复制外,还可以创建连接文件(或者快捷方式)

格式:
cp [-adfilprsu] 源文件(source) 目标文件(destination)

cp [options] source1 source2 source3 …directory

参数:

  • -a 相当于 -pdr ,将文件所有特性一起复制过来,属性和权限不改变(常用)
  • -p 连同文件的属性一起复制过去,而并非使用默认属性(备份常用
  • -r 递归连续复制,用于目录的复制行为
  • -l 进行硬连接的连接文件创建(hard link),而非复制文件本身
  • -s 复制成为软连接(或符号链接)文件(symbolic link),即“快捷方式”文件
  • -d 若源文件为连接文件(link file),则复制连接文件属性而非文件本身
  • 其它略

注意不同身份者,执行cp命令会有不同的结果产生;同时如果想复制别人的数据,必需对该文件有read权限才行。

一些密码文件(例如/etc/shadow及一些配置文件等),不能用cp直接复制,必须加上-a或-p才能完整复制文件权限的参数

cp没有加任何参数时,复制的是源文件,而非连接文件属性,除非使用-d进行复制,得连接文件属性。具体如下图所示


8、rm删除文件

格式:rm [-fir] 【文件/目录】

参数:

  • -f: force的意思,忽略不存在的文件,不会出现警告信息
  • -i: 互动模式,会在删除前询问是否进行操作
  • -r: 递归删除(常用于整个目录删除),因为系统删除时不会提示,所以危险!!!

具体例子如图所示


9、mv移动文件(或重命名)

格式1:mv [-fiu] source destination

格式2:mv [options] source1 source2 source3 … directory

参数:

  • -f: force强制之意,目标文件已经存在,不会询问直接覆盖
  • -i: 交互模式,若目标文件已经存在,会询问是否覆盖
  • -u: 更新模式,若原文件有新内容,才会进行更新

注意用mv进行重命名,每次只能对一个文件;而用rename,每次可以对多个文件命名。如果同时移动多个文件或目录,那么命令的最后一个肯定是目录。具体如图所示


10、which 查找PATH规范的“执行文件”

格式: which [-a] 【命令】

这个命令是根据PATH这个环境变量所规定的路径,去寻找“执行文件”的文件名。一般仅仅显示第一个,加上-a参数,可以列出所有的同名执行文件。

值的注意的是,常用命令cd是找不到的,因为cd是bash内置命令,而不是PATH内所规范的目录。具体如图下所示。


11、whereis 查找指定文件

格式:whereis [-mbsu] 【文件/目录名】
参数:

  • -m:只查找在说明文件manual路径下的文件(即man page)
  • -b:只查找二进制格式文件
  • -s:只查找source源文件
  • -u:查找不在上述三项中的其他特殊文件

具体例子如图所示。


12、locate查找指定文件

whereis和locate都使用数据库来查找数据,所以速度比较快(相对于find来说)。但是数据库是默认每天更新一次,所以用whereis和locate有可能找不到最新的文件,或者甚至有时能找得到已经删除的文件。当然也可以使用updatedb命令更新数据库。

  • updatedb:根据/etc/updatedb.conf设置,去查找硬盘内文件名更新/var/lib/mlocate内的数据库文件。
  • locate:根据/var/lib/mlocate内数据库记载,找出用户输入的关键字文件名

格式:locate [-ir] 【关键字】
参数:

  • -i:忽略大小写差异
  • -r:后面可接正则表达式的显示方式

具体如图所示


13、find 查找指定文件

格式:find [PATH] [option] [action]

参数:这里就非常多了

1)、与时间有关的参数:
有-atime/-ctime/mtime,这里以mtime来举例

命令 含义
-mtime n 列出n天之前的”一天之内”被更改过的文件名(当天,n=0)
-mitme -n 列出n天之内(包括n天本身)被更改过的文件名
-mtime +n 列出在n天之前(不含n天本身)被更改过的文件名
-newer file file为一个已经存在的文件,列出比file还要新的文件名(用于比较文件的新旧关系)


2)、与 用户/用户组 有关的参数

命令 含义
-uid n n为用户账号ID(UID),UID是记录在/etc/passwd 里面与账号名称对应的数字
-git n n为用户组账号ID(GID),GID是记录在/etc/group 中的数字
-user name name为账户名称,可以用于查找系统中某一用户的所有文件
-group name name为用户组名,可以用于查找系统中某一个用户组的所有文件
-nouser 寻找文件的所有者不在 /etc/passwd 的人
-nogroup 寻找文件的所有用户组不存在于 /etc/group中的文件

不小心删除某个账号(或用户),但是该账号(或用户)已经在系统中创建了许多文件,这时候很可能发生“无主”文件存在,于是可以用后面的-nouser/-nogroup命令进行查找。

3)、与文件权限及名称有关的参数

命令 含义
-name filename 查找文件名为filename的文件
-size [+-]SIZE 查找比SIZE还要大or小的文件,SIZE单位有c和k,c表示byte,k表示1024bytes
-type TYPE 查找TYPE类型文件,主要有:一般正规文件(f)、目录(d)、连接文件(l)、设备文件(b,c)、socket(s)及FIFO(p)等属性
-perm mode 查找权限 恰好等于mode 的文件,例如-rwxr-xr-x的mode为4755
-perm -mode 查找权限 必须要包括mode 的文件,例如查找-rwxr–r–(-perm -0744)文件,那么-rwxr-xr-x(-perm -4755)也可以被查找出来,因为后者已经包括了0744的所有权限
-perm +mode 查找权限 包含任一mode 的文件,例如查找-rwxr-xr-x(-perm +775)文件,那么-rw——- 也会被列出来,因为其包含 -rw… 属性


由上可以可以看出find命令包含很多参数,一般的文件查找可以通过whereis/locate很快查找。但是如果文件具有特殊属性,例如需要查找某一个用户的所有文件、需要找出具有具体权限的文件等等,find命令在这一方面大显神通。具体如图所示。




接下来是文件内容查阅,各种方式总结如下

命令 含义
cat/tac 由第一行开始显示文件内容;tac是cat的倒写,从最后一行开始显示
nl 显示时顺便输出行号
more/less 一页一页地显示文件内容;less与more类似,但可以往前翻
head/tail 只看头/结尾几行
od 二进制方式读取文件内容

14、cat/tac 显示文件内容

格式:cat [-nbAvET]

参数:

  • n:输出时顺带打印行号(包括空白行)
  • b:输出时顺带打印行号(不包括空白行)
  • A:可以列出一些特殊字符,相当于vET的整合参数
  • v:列出一些看不见的特殊字符
  • E:将结尾的断行字符$显示出来
  • T:将[Tab]键以^I形式显示出来

同时tac和cat正好反着来,由最后一行到第一行反向在屏幕上输出。具体如图所示


15、nl 添加行号打印

其实我觉得这个功能和 cat -n file 很相似

格式:nl [-bnw] 【文件】
参数:

  • -b:指定行号指定方式,有两种:
    • -b a:无论为空行,皆列出行号(类似cat -n)
    • -b t:如果有空行,空的一行不输出行号(默认值)
  • -n:列出行号表示方法,有3种:
    • -n ln:行号在屏幕最左方显示
    • -n rn:行号在自己字段的最右方显示,不加0
    • -n rz:行号在自己字段的最右方显示,加0
  • -w:行号字段占用的位数

具体如下图所示


16、more/less 翻页查看

more和less可以一页一页翻动,查看文件内容。两者功能差不多,但less要比more灵活一些,less不仅可向下亦可向上查询,但是more仅能向下查询,这里仅仅介绍less。less的使用界面和man page非常类似,因为man命令实际上是调用less来显示文件的内容的。

可以输入的命令有如下:

命令 含义
空格键 向下翻一页
【Page Down】 向下翻一页
【Page Up】 向上翻一页
/string 向下查询string这个字符串
?string 向上查询string这个字符串
n,N 利用/或者?来查询字符串的时候,可以用n进行正向查询,N进行反向查询
q 结束这一次less程序

举例如图所示:


17、head/tail 进行数据选取

  • head 命令选取前面几行
  • tail 命令选取后面几行

格式:head/tail [-n number] 【文件】

n代表行数,比较特别的如果想选取10~20行间的数据,可以用管道命令,具体为 “head -n 20 filename | tail -n 10”。例子如图所示。


18、od 查看二进制文件

由于执行文件多为二进制(binary file)文件,所以用一般的命令读取,通常会产生类似乱码情况
格式: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

具体例子如图所示:1)、将文件用ASCII形式输出 2)、将文件以八进制列出存储值与ASCII的对照表(C代表对照之意)


19、umask 文件默认权限

umask指定当前用户在新建文件/目录时的权限默认

  • 用户创建文件,一般默认没有x权限,最大666,为:-rw-rw-rw-
  • 用户创建目录,一般默认x权限开放,最大777,为:drwxrwxrwx

注意:umask分数指的是 ”该默认值需要减掉的权限“,例如图2中,umask=0002,说明others被减去了w的权限,于是有如下

  • 新建文件:(-rw-rw-rw-)-(——–w-)==> -rw-rw-r–
  • 新建目录:(drwxrwxrwx)-(——–w-)==> drwxrwxr-x

同理可以知道,如果设置umask=022,那么group和other分别被剥夺w权限,这时候只有用户自己有w权限,同组的和其它仅仅就剩r权限了,如果用于多人编辑的环境中,当然是不合适了


20、chattr/lsattr 文件隐藏属性

文件除了那9个权限之外,还有隐藏属性,隐藏属性通常对系统安全等方面发挥较大作用

  • chattr 设置文件的隐藏属性
  • lsattr 显示文件隐藏属性

1) 格式1:chattr [+-=][ASacdistu]【文件或目录名】

参数 含义
+ 增加某一个特殊参数,其它原本存在的参数不变
- 删除某一个特殊参数,其它原本存在的参数不变
= 仅有后面接的参数
a 设置a参数后,文件只能增加数据不能删除也不能修改,仅有root才能设置这个属性
i 设置i参数后,文件无法删除、修改,设置连接也无法写入或添加数据。非常厉害!!对于安全系统有很大帮助,只有root能设置此属性
A 设置A参数后,若有访问此文件(或目录),其访问时间(atime)将不会被修改。可以避免I/O较慢的机器过度访问磁盘,对速度较慢的计算机有帮助
S 设置S参数后,进行任何文件的修改,改动将以”同步“方式写入磁盘中(一般是异步写入磁盘)
c 设置c参数后,将自动将文件压缩,读取时自动解压。在存储时,将先进行压缩后存储,对打文件有利
d 设置d参数后,当dump程序被执行时,可将文件(或目录)不被dump备份
s 设置s参数后,若文件被删除,它将被完全从这个磁盘中删除
u 与s相反,若文件被删除,数据内容还存在磁盘中,可以用来找回该文件

如图所示,一般用户无法进行参数的修改,所以首先要切换到root权限;同时加了i参数后,root权限下也无法删除文件,只有重新减去i参数才能顺利删除。

2) 格式2:lsattr [-adR] 【文件或目录】

  • -a 显示文件的隐藏属性
  • -d 如果是目录,仅列出目录本身属性,而非目录内的文件名
  • -R 连同子目录也一并列出来



由上可以总结文件/目录的权限关系

项目 命令 目录所需权限 文件所需权限
用户进入某目录 cd等 用户对目录至少要有x权限;若想在目录内成为“可工作目录”,执行ls查询文件名等,还需r权限 /
用户在某个目录中读取一个文件 cat,more,less等 用户对目录至少要有x权限 用户对文件至少有r权限
用户可以修改一个文件 vim编辑器等 用户对目录至少要有x权限 用户对文件至少有r,w权限
用户创建/复制/删除一个文件 / 目录要有w,x等权限,重点在w /
用户进入目录并执行该目录下的某个命令 / 用户对目录至少要有x权限 用户对文件至少有x权限


终于写完了233…

-------------本文结束感谢您的阅读-------------