当前位置: 首页 > news >正文

linux基础学习--linux文件与目录管理

linux文件与目录管理

1. 目录与路径

1.1 相对路径与绝对路径
  • 绝对路径:路径写法一定从根目录/写起
    • 绝对路径的正确度要高。
  • 相对路径:路径写法不是由/写起
1.2 目录的相关操作

切换目录的命令是cd,下面是比较特殊的目录:

.  代表此层目录
.. 代表上一层目录
-  代表前一个工作目录
~  代表当前使用者身份所在的家目录

. 和 … 在所有目录下都会存在。甚至在根目录下也都存在,不过此时代表根目录上一层的(.)和根目录自己的(…)是同一个目录。
常见的处理目录的命令:

  • cd:切换目录。
    在Linux中, 一个用户的家目录就是/home/用户名/,root用户的家目录是/root/。使用~+用户名表示对应用户的家目录。使用相对路径时,必须保证想去目录在当前目录下。
  • pwd:显示当前目录。
    pwd [-p],其中-p表示显示出真正路径,而不是使用链接路径。
  • mkdir:建立一个新目录。
    mkdir [-mp]
    [-m]:设置文件的权限。
    [-p]:建立多层级目录时添加。
  • rmdir:删除一个空目录。
    rmdir [-p]-p表示连同上一层的空目录也一并删除。
1.3执行文件路径的变量:$PATH

PATH就是环境变量,通常写作$PATH,$表示后面接的是变量,这个变量由一堆目录所组成,每个目录中间由冒号(:)隔开,每个目录有顺序之分。我们所使用的命令,之所以可以仅仅输入命令名称就可以运行,是因为这些命令的文件所在的目录就在变量 $PATH中。一旦某个命令的文件被移 出 $PATH中记录的目录,那么无论在哪个目录输入这个命令的名称来执行它,都不能执行成功。

2.文件与目录管理

2.1 文件与目录的查看:ls

ls命令是linux系统中相当常见的命令。
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),而非内容修改时间。

当只执行ls时,默认显示的只有:非隐藏的文件的文件名,以文件名进行排序及文件名代表的颜色显示

2.2 复制,删除与移动:cp,rm,mv
  • cp(复制文件或目录)
    当需要复制文件时,要使用cp这个命令。这个命令除了复制,还可以建立链接文件,对比两文件的新旧而予以更新,以及复制整个目录。
    移动目录和文件,使用mv命令,这个命令也可以用来重命名。
    删除,使用rm这个命令。
  • cp(复制文件或目录)
    cp [指令] 源文件 目标文件
    cp [options] sourcel source2 source3 ... directory
-a :相当于-dr --preserve=all的意思。
-d :若源文件为链接文件的属性,则复制链接文件属性而非文件本身。
-f :为强制的意思,若目标文件已经存在且无法开启,则删除后再尝试一次。
-i :若目标文件已经存在时,在覆盖时会先询问操作的进行(常用)。
-l :进行硬链接的链接文件建立。
-p :连同文件的属性(权限,用户,时间)一起复制过去,而不是使用默认。
-r :递归复制,用于目录的复制操作;
-s :复制成为符号链接文件,即"快捷方式"文件。
-u :destination比source旧才更新description,或description不存在的情况下才复制。
--preserve=all :除了-p的权限相关参数外,还加入了SELinux的属性,links,xattr等也复制。

对于不同的身份者,执行这个命令会有不同的结果产生,尤其是-a-p的选项,对于不同的身份来说,差异特别大。
而在默认的条件中,cp的源文件与目标文件的权限是不同的,目标文件的拥有者通常是命令操作者本身
因此,在使用cp命令复制一些特殊权限文件时,把你直接使用cp进行复制,必须加上-a或者-p完整复制权限。

  • rm(删除文件或目录)
    rm [-fir] 文件或目录
-f :就是froce的意思,忽略不存在的文件,不会出现警告信息。
-i :交互模式,在删除前会询问使用者是否操作。
-r :递归删除,最常用于目录的删除,这个选项相当危险。

在linux系统下,为了避免文件被删除,很多Linux发行版中已经默认加入了-i这个选项。

  • mv(移动文件与目录,或者重命名)
    mv [-fiu] source destination
    mv [option] source1 source2 source3 ... directory
-f :foece强制的意思,如果目标文件已经存在,不会询问而是直接覆盖。
-i :若目标文件已经存在时,就会询问是否覆盖。
-u :若目标文件已经存在,且source比较新,才会更新。
2.3获取路径的文件名与目录名称
  • basename获取文件名
    basename + 路径返回最后的文件名。
  • dirname获取目录名
    dirname + 路径返回路径中的目录名。

3.文件内容查看

常见的显示文件内容的命令有catmoreless。此外还有tailtac

  • cat 由第一行开始显示文件内容。
  • tac 从最后一行开始显示,可以看出tac时cat的倒着写。
  • nl 显示的时候,同时输出行号。
  • more 一页一页地显示文件内容。
  • less 与more相似,但比more更好,可以往前翻页。
  • head 只看前面几行。
  • tail 只看后面几行。
  • od 以二进制的方式读取文件内容。
3.1 直接查看文件内容

直接查看一个文件的内容可以使用cat/tac/nl这些命令:

  • cat
    cat [-AbEnTv] 文件名
-A :相当于-vET的整合选项,可列出一些特殊字符而不是空白而已。
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号。
-E :将结尾的换行符$显示出来。
-n :打印出行号,连同空白行也会有行号,与-b的选项不同。
-T :将[tab]按键以^I显示出来。
-v :列出一些看不出来的特殊字符。

cat命令查看一些较小文件还有,文件行数过大时根本来不及查看结果。

  • tac(反向列示)
    tac命令与cat命令基本相同,只是cat是从第一行输出到最后一行,tac是从最后一行输出到第一行。
  • nl(添加行号打印)
    nl [-bnw] 文件
-b :指定行号指定的方式,主要有两种:-b a :表示不论是否为空行,也同样列出行号。-b t :如果有空行,空的那一行就不要列出行号。
-n :列出行号表示的方法有三种:-n ln :行号在屏幕的最左方显示。-n rn :行号在自己栏位的最右方显示,且不加0。-n rz :行号在自己栏位的最右方显示,且加0。
-w :行号栏位的占用的字符数。

nlcat -n类似,但它可以做更多的显示设计。

3.2 可翻页查看

前面的命令都是一口气把所有数据都显示出来,而moreless可以进行分页显示。

  • more(一页一页翻动)
    more 文件
    如果more后文件的行数大于屏幕输出的行数时,会在最后一行显示出目前显示的百分比,还可以在最后一行输入一些有用的命令。
空格键(space):代表向下翻一页。
Enter :代表向下翻一行。
/字符串:代表在这个显示的内容当中,向下查找字符串这个关键词。
:f :立刻显示出文件名以及目前显示的行数。
q :代表立刻离开more,不再显示该文件内容。
b或[ctrl]-b :代表往回翻页,不过这操作只对文件有用,对管道无用。
  • less(一页一页翻动)
    less的用法更加灵活,在more中我们并没有办法往前翻,只能向后,如果使用了less,就可以使用【pageup】【pagedown】等按键的功能来往前往后翻看文件。除此之外,还有许多的查找功能。
空格键:向下翻动一页。
[pagedown]:向下翻动一页。
[pageup]:向上翻动一页。
/字符串:向上查找字符串的功能。
?字符串:向上查找字符串的功能。
n:重复前一个查找(与/或?有关)。
N:反向的重复前一个的查找(与/或?有关)。
g:前进到这个数据的的第一行。
G:前进到这个数据的最后一行去(注意大小写)。
q:离开less这个程序。
3.3 数据截取

我们可以对输出的数据进行一个简单的截取,就是取出文件前面几行(head)或者取出后面几行(tail)文字的功能,不过都是以“行”为单位进行数据截取的。

  • head(取出前面几行)
    head [-n number] 文件
-n :后面接数字,代表几行的意思。

不加-n时默认只显示十行,如果数字m前加-时,就是输出前面的所有行数,只留最后m行。

  • tail(取出后面几行)
    tail [-n number] 文件
-n :后面接数字,代表几行的意思。
-f :表示后面持续刷新显示后面所接文件中的内容,直到按下[ctrl]-c才会结束。

用法与head类似,不过当数字m前加+时,就表示从第m行开始输出后面所有的内容。

3.4 非纯文本文件:od

以上命令都是查看纯文本文件时使用的,使用它们读取非文本文件时会输出乱码,而执行文件通常是二进制文件,伺此时可以使用od这个命令读取。
od [-t TYPE] 文件

-t :后面可以跟各种【类型(TYPE)】的输出,例如:a :利用默认的字符来输出。c :使用ASCII字符进行输出。d[size] :利用十进制来输出数据,每个整数占用size Bytes。f[size] :利用浮点数值来输出数据,每个整数占用size Bytes。o[size] :利用八进制来输出数据,每个整数占用size Bytes。x[size] :利用十六进制来输出数据,每个整数占用size Bytes。 
3.5 修改文件创建时间或创建新文件:touch

在每个文件下都会记录许多的时间参数,其实是有三个主要的变动时间:

  • 修改时间(mtime)
    • 当该文件的【内容数据】变更时,就会更新这个时间,内容数据指的是文件的内容,而不是文件的属性或者权限。
  • 状态时间(ctime)
    • 当文件的【状态】改变时,就会更新这个时间,举例来说,像是权限和属性被更改了,都会更新这个时间。
  • 读取时间(atime)
    • 当【该文件的内容被读取】时,就会更新这个时间,举例来说,我们使用cat去读取一个文件时,该文件简单atime。
      默认情况下,ls显示出的时间是该文件的mtime,也就是这个文件上次被修改的时间。可以使用touch来修改时间。
      touch [-acdmt] 文件
-a :仅自定义atime。
-c :仅修改文件的时间,若文件不存在则建立新文件。
-d :后面可以接欲自定义的日期而不用目前的日期,也可以使用--data="日期或时间"。
-m :仅可修改mtime。
-t :后面可以接欲自定义的时间而不用目前的时间,格式为[YYYYMMDDhhmm]。

默认情况下,touch直接接文件,这个文件的三个时间(atime/ctime/mtimew)都会更新为目前的时间。若该文件不存在,就会主动建立一个新的空文件。
touch最常用的就是:

  • 建立一个空文件。
  • 将某个文件日期自定义为目前(mtime与atime)。

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

在Linux中除了r,w,x等属性外,在Linux传统的ext2,ext3,ext4文件系统下,还可用设置其他的隐藏属性,可以用chattr设置,以lstar查看,最重要的属性就是设置其不可修改的特性,让连文件的拥有者都不能进行修改。但在centos7中使用xf作为默认文件系统,xfs仅支持chattr的部分参数。

4.1文件的默认权限:umask

umask就是指目前用户在建立文件或目录时的权限默认值。查看umask的方法有两种:

  • 直接输入umask,就可以看到数字类型的权限设置值。
  • 输入umask -S,以符号类型的方式来显示权限。
    在默认权限的属性上,目录与文件是不一样的。
    对于文件,一般是用来记录数据的,执行的权限并不必要,那么就只有rw这两个权限,也就是说最大为666,如下:
-rw-rw-rw-

对于目录,由于x与是否可以进入此目录有关,因此默认为所有权限均开放,即777,如下:

drwxrwxrwx

umask指的是该默认值需要减掉的权限,r,w,x对应4,2,1,对应的数字表示减掉对应权限。
需要设置umask时,直接umask + 数字就可以更改默认权限了。

4.2文件隐藏属性

以下的chattr命令只在ext2,ext3,ext4的传统文件系统上完整生效。

  • chattr(配置文件隐藏属性)
    chattr [+-=] [ASacdistu] 文件或目录名称
+ :增加某一个特殊参数,其他原本存在的参数则不动。
- :删除某一个特殊参数,其他原本存在的参数则不动。
= :直接设置参数,且仅有后面接的参数。
A :当直接设置A这个属性时,若你在存取此文件时,它的存取时间将不会被修改,可避免I/O较慢的机器过度的读写磁盘。
S :一般文件是非同步写入磁盘的,如果加上S这个属性时,当你进行任何文件的修改,该修改会同步写入磁盘中。
a :当设置a之后,这个文件将只能增加数据,而不能删除或修改数据,只有root用户才能设置这属性。
c :这个属性设置之后,将会自动的将此文件【压缩】,在读取的时候会自动的解压缩。
d :当dump程序被执行时,设置d属性将可使该文件(或目录)不会被dump备份。
i :可以让一个文件【不能被删除,改名设置链接也无法写入或新增数据】只有root可以设置此属性。
s :当文件设置了s属性,如果该文件被删除,它将完全从硬盘被删除,如果误删将完全无法被恢复。
u :与s相反,当使用u来配置文件时,如果该文件被删除,则数据内容其实还存在与磁盘中,可以用来恢复该文件。
  • lsattr(显示文件隐藏属性)
    lsattr [-adR] 文件或目录
-a :将隐藏文件的属性也显示出来。
-d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名。
-R :连同子目录的数据也一并列出来。
4.3 文件的特殊权限:2025-04-21 07:08,SGID,SBIT
  • Set UID
    当s这个标志出现在文件拥有者的x权限上时,被称为Set UID,简称为SUID的特殊权限,它有着这样的限制和功能:

  • SUID权限仅对二进制程序有效。

  • 执行者对于该程序需要有x的可执行权限。

  • 本权限仅在执行该程序的过程中有效。

  • 执行者将具有该程序拥有者的权限。
    总得来说,执行者需要对这个二进制文件有x权限,执行该文件时,会暂时获得这个文件拥有者的权限。
    SUID就可以用在二进制文件上,不能用在shell脚本上。

  • Set GID
    当s标志出现在用户组的x时则被称为Set GID,与SUID不同,SGID可以针对文件或目录进行设置,对文件来说,SGID有如下功能:

  • SGID对二进制有用。

  • 程序执行者对于该程序来说具有x权限。

  • 执行者在执行过程中将会该程序用户组的支持。
    与SUID相似,执行者需要对该文件有x权限,执行该文件时,会暂时获得这个文件用户组的权限。
    SGID也可以对目录作用,当一个目录设置SGID的权限后,就会有如下的权限:

  • 用户如果对此目录具有r和x权限,该用户能够进入此目录。

  • 用户在此目录下的有效用户组将会变成该目录的用户组。

  • 用途:若该用户在此目录下拥有w的权限(可以新建文件),则用户所建立的新文件,该新文件的用户组与此目录的用户组相同。

  • Sticky Bit
    SBIT目前只针对目录有效,对文件无效果,对目录的作用是:

  • 当用户对于此目录具有w,x权限,即具有写入的权限。

  • 当用户在该目录下建立文件或目录时,仅有自己与root才有权利删除该文件。

  • SUID/SGID/SBIT权限设置
    可以使用数字修改权限的方式修改,在原来的三个数字前再加一位数字:

特殊权限数值含义
SUID4程序运行时以文件拥有者的身份执行(常用于可执行文件)
SGID2程序以文件所属组身份执行 / 目录中新建文件继承所属组
Sticky Bit1常用于目录,只有文件拥有者或 root 能删除该目录下的文件
  • 注意,这三个权限的s和t是取代x权限的,当使用ls命令进行查询时,s或t会直接取代x来显示。而当无x权限,会变成大写的X和S。
    SUID,SGID,SBIT 分别绑定在 user/group/other的x权限上,当拥有这些隐藏权限时,x就会被替换。
4.4 观察文件类型:file

file命令,可以用来查看某个文件的基本信息,如是属于ASCII或是数据文件或是二进制文件,且,其中有没有用到动态链接库等信息。
用法:file 文件

5.命令与文件的查找

5.1 脚本文件的查找
  • which(查找【执行文件】)
    which [-a] command
-a :将所有由PATH目录中可以找到的命令均列出,而不止第一个被找到的命令名称。

这个命令是根据【PATH】这个环境变量所规范的路径,去查看执行文件的文件名。

5.2 文件的查找

在Linux中,一般不常用find命令来查找,不仅速度很慢,也影响硬盘性能。
一般先使用whereis locate来查找,whereis只找系统中某些特定目录下面的文件,locate则是则是利用数据库来查找文件名。

  • whereis(由一些特定的目录中查找文件)
    whereis [-bmsu] 文件或目录名
-l :可以列出whereis会去查询的几个主要的目录。
-b :只找binary(二进制)格式的文件。
-m :只找在说明文件manual路径下的文件。
-s :只找source源文件。
-u :查找不在上述三个项目当中的其他特殊文件。
  • locate/updatedb
    locate [-ir] keyword
-i :忽略大小写的差异。
-c :不输出文件名,仅计算找到的文件数量。
-l :仅输出几行的意思,例如输出五行则是-l 5。
-S :输出locate所使用的数据库文件的相关信息,包括数据库记录的文件/目录数量等。
-r :后面可接正则表达式的显示方式。

locate查询的速度相当快速,因为它是通过已建立的数据库查询的,不需要去硬盘中读取数据。
而CentOS 7中数据库是每天一更新的,这就导致在数据库更新前新建的文件会查询不到,此时可以使用updatadb来手动更新数据库。

  • find
    find [PATH] [option] [ation]
1.与时间有关的参数:-atime,-ctime与-mtime。
-mtine n :n为数字,意义为在n天之前的【一天之内】被修改过内容的文件。
-mtine +n :列出在n天之前被修改过内容的文件。
-mtine -n :列出在n天之内被修改过内容的文件。
-newer file :file为一个实际存在的文件,列出比file还新的文件。
  • +n :代表大于等于n天前的文件。
  • -n :代表小于等于n天前的文件。
  • n :是代表n到n+1那天的文件。
2.与使用者或用户组名称有关的参数:
-uid n :n为数字,这个数字是使用者的账号ID,即UID,记录在/etc/passwd里面。
-gid n :n为数字,这个数字是用户组名称的ID,即GID,记录在/etc/group中。
-user name :name为使用者账号名称。
-group name :name为用户组名称。
-nouser :查找文件的拥有者不在/etc/passwd中。
-nogroup :查找文件的拥有用户组不存在于/etc/group的文件,当你自行安装软件时,很可能该软件的属性中并没有文件拥有者。

当系统中的某个账号被删除,但是该账号中存储了很多文件时,很可能就会产生无主文件,就要使用-nouser来查找该类型的文件。

3.与文件权限及名称有关的参数:
-name filename :查找文件名称为file的文件。
-size [+-]SIZE :查找比SIZE还要大或者小的文件,这个SIZE的规格有:c:代表Bytes,k:代表1024Bytes。
-type TYPE :查找文件的类型为TYPE的,类型主要有:一般正规文件(f),设备文件(b,c),目录(d),链接文件(l),scoket(s),及FIFO(p)等属性。
-perm mode :查找文件权限【刚好等于】mode的文件,这个mode为类似chmod的属性值,即4755这类。
-perm -mode :查找文件权限【必须要囊括mode的权限】的文件,例如查询0744的文件,4755的文件也会被列出,因为4755已经囊括0744了。
-perm/mode :查找文件权限【包含任一mode的权限】的文件。
4.额外可进行的操作
-exec command :command为其他命令,-exec后面可以在接额外的命令来处理查找到的结果。
-print :将结果打印到屏幕上,这个操作时默认操作。

举个例子find /usr/bin /usr/sbin -perm /7000 -exec ls -l () \;

  • {}代表的是由find找到的内容,这些结果会被放到{}中。
  • -exec到;是关键词,代表find额外操作的开始(-esec)到结束(;),这中间的就是find命令的额外操作。
  • ;在bash环境下有特殊意义,因此使用反斜杠\来转义。
    另外,find命令还可以通过通配符来查询文件名,例如,想要查找/etc目录下文件名包含http的文件,就可以:
    find /etc -name '*http*'

相关文章:

  • 目标检测篇---Fast R-CNN
  • 四元数转旋转矩阵
  • 第一篇:从哲学到管理——实践论与矛盾论如何重塑企业思维
  • Java高频面试之并发编程-04
  • 瑞吉外卖-分页功能开发中的两个问题
  • Python爬虫实战:获取高考网专业数据并分析,为志愿填报做参考
  • 【Python爬虫实战篇】--爬取豆瓣电影信息(静态网页)
  • 【Python网络爬虫开发】从基础到实战的完整指南
  • 算法之动态规划
  • 【Unity iOS打包】报错解决记录
  • 34、Spark实现读取XLS文件
  • Linux 进程与线程间通信方式及应用分析
  • 什么是Manus,国内用户如何订阅Manus
  • 论文阅读HARIVO: Harnessing Text-to-Image Models for Video Generation
  • 【论文速递】2025年06周 (Robotics/Embodied AI/LLM)
  • 随机过程,相关函数的一个例题|柯尔莫哥洛夫存在定理
  • 17.整体代码讲解
  • 动态规划-零钱兑换
  • 自动驾驶最新算法进展
  • (二十九)安卓开发中DataBinding 和 ViewBinding详解
  • 讲座|在数字化时代,“记住”到底意味着什么
  • 美国同日曝两起泄密事件:防长群聊向家人分享作战计划,白宫平面图被“共享”
  • 运油-20亮相中埃空军联训
  • 俄官员称乌克兰未遵守停火,乌方暂无回应
  • 大悦城:去年净亏损29.77亿元,三年累计亏损超70亿元
  • 中国船协发布关于美对华造船业实施限制措施的严正声明