鸟叔 Linux 学习记录 - 第六章 3.20更新

本文介绍了Linux系统中的目录与路径概念,重点讲解了目录操作命令如cd、mkdir、rmdir,以及复制、删除和移动文件的cp、rm、mv命令。此外,还详细解释了执行文件路径的变量$PATH,文件查看、日期时间管理和非文本文件操作的方法,如touch和od。
摘要由CSDN通过智能技术生成

第6章 Linux 文件与目录管理

6.1 目录与路径

6.1.2 目录的相关操作

比较特殊的几个目录,需要记忆:

.	代表此层目录
..	代表上一层目录
~	代表目前使用者身份所在的家目录
~account 代表account这个使用者的家目录

特别注意:在所有目录下面都会存在的两个目录,分别是【.】【…】;根目录下面也有上层目录,只不过与根目录自己是一个目录

常见的处理目录的命令:

  • cd(change directory,切换目录)

    语法:cd 相对路径或绝对路径
    
    eg:当前用户是root
    cd ~ #进入家目录,/root
    cd ~xuan #进入用户xuan的家目录
    cd .. #返回上一层目录
    cd - #返回上一个工作目录
    cd #进入家目录
    cd /var/spool/mail #绝对路径写法,进入该目录
    cd ../plymouth #相对路径写法
    

    1692098644023

  • pwd(显示当前所在目录)

    语法:pwd [-P]
    选项与参数:
    -P:显示出真正的路径,而非使用链接路径
    

    1692099078201

  • mkdir (建立新目录)

    语法:mkdir [-mp] 目录的名称
    选项与参数:
    -m:设置文件的权限
    -p:帮你直接将所需的目录(包含上层目录)递归创建
    
    eg1:
    在tmp下面创建数个新目录
    mkdir test
    mkdir -p test1/test2/test3/test4
    
    eg2:
    创建权限为 rwx--x--x 的目录
    mkdir -m 711 test2
    

    1692156709606

  • rmdir (删除“空”的目录)

    语法:rmdir [-p] 目录名称
    选项与参数:
    -p:连同上层“空的”目录也一起删除
    
    eg:
    删除上面刚创建的目录
    rmdir test
    rmdir -p test1/test2/test3/test4
    

    注意:目录必须要一层一层的删除才行,而且被删除的目录里面必定不能存在其他的目录或文件

    1692157158271

6.1.3 关于执行文件路径的变量:$PATH

当执行一个命令时,如 ls,系统会依照PATH的设置去每个 PATH 定义的目录下查找文件名为 ls 的可执行文件,如果有多个文件名为 ls 的可执行文件,那么先查找到的同名命令先被执行

PATH 前面加的 $ 表示后面接的是变量

PATH 这个变量的内容是由一堆目录所组成,每个目录中间用冒号来隔开,每个目录有顺序之分

1692158523193

1692158538967

总结:

  • 不同身份用户默认的 PATH 不同,默认能够随意执行的命令也不同

  • PATH 是可以修改的

    PATH="${PATH}:/root"
    
  • 使用绝对路径或相对路径直接指定某个命令的文件名来执行,会比查找 PATH 来的正确

  • 命令应该要放置到正确的目录下,执行才会比较方便

  • 本目录(.)最好不要放到 PATH 变量当中

6.2 文件与目录

6.2.1 文件与目录的查看:ls

语法:ls [参数] 文件名或目录名
选项与参数:全部使用man查看,只列几个常用的
-a:全部的文件,包括隐藏文件
-d:仅列出目录本身,而不是列出目录内的文件数据
-l:详细信息显示

1692627954290

1692627974880

6.2.2 复制、删除与移动:cp、rm、mv

  • cp(复制文件或目录、建立链接文件、比对两文件的新旧予以更新)

    语法:
    cp [options] 源文件(source) 目标文件(destination)
    cp [options] source1 source2 source3 ... directory
    选项与参数:
    -a:相当于-dr --preserve=all 的意思
    -d:若源文件为链接文件属性,则复制链接文件属性而非文件本身
    -i:若目标文件已经存在时,在覆盖时会先询问操作的进行
    -p:连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用)
    -r:递归复制,用于目录的复制操作
    --preserve=all:除了 -p 的权限相关参数外,还加入SELinux的属性,links、xattr等也复制
    -s:复制成为符号链接文件,即快捷方式
    -u:目标文件比源文件旧才更新目标文件,或目标文件不存在的情况下才复制
    注意:如果源文件有两个以上,则最后一个目标文件一定要是“目录”才行
    
    • 范例一:用root身份,将家目录下的任意文件复制到 /tmp下,并更名

      1692707945292

    • 范例二:切换到目录 /tmp,并将 /var/log/wtmp 复制到 /tmp 并观察属性

      1692707932698

      1692708047352

      一般来说,我们如果去复制别人的数据(该文件必须有read权限才行)时,总是希望复制到的数据是我们自己的,所以在默认的条件中,cp 的源文件与目标文件的权限是不同的,目标文件的拥有者通常会是命令操作者本身

    • 范例三:复制 /etc/ 这个目录下的所有内容到 /tmp 下面
      想要权限保持不变可以加 -a 参数

      1692709022685

    • 范例四:将范例一复制的文件建立一个符号链接文件
      -l 是硬链接;-s 是符号链接,即快捷方式

      1692709143993

    • 范例六:将范例四的 slink 文件复制成 slink1 slink2
      没有加上任何选项时复制的是原始文件。而非链接文件的属性
      若要复制链接文件的属性,就得要使用 -d 的选项

      1692709582127

      1692709595566

    • 例题:能否使用 xuan 的身份,完整地复制 /var/log/wtmp,到目录 /tmp 中并更名
      答:能够复制,但由于 xuan 的身份无法随意修改文件的拥有者与用户组,即使加上 -a 选项,也是无法完成完整权限的复制

      1692709932612

      总之,由于 cp 有种种的文件属性与权限的特性,所以,在复制时,必须清楚地了解到:

      • 是否需要完整的保留源文件的信息?
      • 源文件是否为符号链接文件?
      • 源文件是否为特殊的文件,例如 FIFO、socket等?
      • 源文件是否为目录?
  • rm(删除文件或目录)

    语法:
    rm [参数] 文件或目录
    选项与参数:
    -f:强制删除,忽略不存在的文件,不会出现告警信息
    -i:交互模式,在删除前会询问使用者是否操作(root身份默认加入此参数)
    -r:递归删除,最常用于目录的删除,这是非常危险的选项
    
    范例一:将在cp范例中建立的bashrc删除掉
    范例二:通过匹配符*的帮忙,将 /tmp 下面开头为bashrc的文件名通通删除
    范例三:将cp范例中建立的/tmp/etc目录删除
    在命令前加上反斜杠,可以忽略掉 alias 的指定选项
    范例四:删除一个带有-开头的文件
    所以文件名最好不要用-开头,系统会误判
    

1693101480927

1693101547708

1693101582661

1693101677700

  • mv(移动文件与目录,或重命名)

    语法:
    mv [参数] source destination
    mv [参数] source1 source2 ... directory
    选项与参数:
    -f:强制,如果目标文件已经存在,不会询问而直接覆盖
    -i:若目标文件已经存在,就会询问是否覆盖
    -u:若目标文件已经存在,且 source 比较新,才会更新
    
    范例一:复制一文件,建立一目录,将文件移动到目录中
    范例二:将刚刚目录重命名
    还可以使用rename,可以进行多个文件名的同时重命名(更改其中相同名字的部分)
    范例三:再建立两个文件,移动到目录中
    

1693102120659

1693102399327

6.2.3 获取路径的文件名与目录名称

1693102523378

6.3 文件内容查看

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

6.3.1 直接查看文件内容

  • cat(concatenate)

    语法:
    cat [参数]
    选项与参数:
    -A:相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已
    -b:列出行号,仅针对非空白行做行号显示
    -E:将结尾的换行符 $ 显示出来
    -n:打印出行号,连同空白行
    -T:将 [Tab] 建以 ^I 显示出来
    -v:列出一些看不出来的特殊符号
    

1693129560715

  • tac

1693129602317

  • nl(添加行号打印)

    语法:
    nl [参数] 文件
    选项与参数:
    -b:指定行号指定的方式,主要由两种:
    	-b a:表示不论是否为空行,也同样列出行号(类似 cat -n)
    	-b t:如果有空行,空的那一行不要列出行号(默认值)
    -n:列出行号的表示方法,主要有三种:
    	-n ln:行号在屏幕的最左方显示
    	-n rn:行号在自己栏位的最右方显示,且不加0
    	-n rz:行号在自己栏位的最右方显示,且加0
    -w:行号栏位的占用的字符数	
    

1693130186935

1693130211800

6.3.2 可翻页查看

  • more(一页一页翻动)

    语法:
    more 文件名
    
    eg:
    more /etc/man_db.conf
    

    1693130682181

    在 more 这个程序的运行过程中,有几个按键可以使用:

    • 空格键:向下翻一页
    • Enter:向下翻一行
    • /字符串:在这个显示的内容当中,向下查找这个字符串的关键字,重复查找同一个字符串,按 n 即可
    • :f:立刻显示出文件名以及目前显示的行数
    • q:代表立刻离开
    • b:往回翻页,不过此操作只对文件有用,对管道无用
  • less(一页一页翻动)

    用法同 more

    常用输入命令(全部可以用 man 查看):

    • 空格键:向下翻动一页
    • [pagedown]:向下翻动一页
    • [pageup]:向上翻动一页
    • /字符串:向下查找字符串
    • ?字符串:向上查找字符串
    • n:重复前一个查找(与/与?有关)
    • N:反向的重复前一个查找
    • g:前进到这个数据的第一行(查找的数据)
    • G:前进到这个数据的最后一行
    • q:离开这个程序

6.3.3 数据截取

  • head(取出前面几行)

    语法:
    head [-n number] 文件
    选项与参数:
    -n:后面接数字,代表显示几行的意思
    不加参数默认显示10行
    
    eg1:
    显示前20行
    head -n 20 /etc/man_db.conf
    
    eg2:
    后面100行数据都不打印,只打印前面几行
    head -n -100 /etc/man_db.conf
    -n 选项后面的参数若是负数,代表列出前面的所有行数,但不包括后面100行
    

    1693312927090

    1693312947307

  • tail(取出后面几行)

    语法:
    tail [-n number] 文件
    选项与参数:
    -n:后面接数字,代表显示几行的意思
    -f:表示持续刷新显示后面所接文件中的内容,要等到按下 [ctrl] + c 才会结束
    不加参数默认显示10行
    
    eg:
    显示后20行
    tail -n 20 /etc/man_db.conf
    显示100-结尾131行
    tail -n +100 /etc/man_db.conf
    

    1693313462814

    1693313483139

例题

显示 /etc/man_db.conf 的11到20行,并显示行号

head -n 20 /etc/man_db.conf | tail -n 10 | cat -n

1693313690638

6.3.4 非纯文本文件: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

eg1:
使用ASCII方式显示内容
od -t c /etc/passwd

eg2:
将这个文件的内容以八进制列出存储值与ASCII的对照表
od -t oCc /etc/issue

1693397664712

1693397939053

1693398014534

6.3.5 修改文件时间或创建新文件:touch

  • 修改时间(modification time,mtime)

    当该文件的【内容数据】变更时,就会更新这个时间,内容数据指的是文件的内容,而不是文件的属性或权限

  • 状态时间(status time,ctime)

    当该文件的【状态】改变时,就会更新这个时间,举例来说,权限与属性被更改了,会更新

  • 读取时间(access time,atime)

    当【文件的内容被读取】时,就会更新这个时间,比如用 cat 读取文件时

1693398501087

默认情况下,ls 显示出来的是文件的 mtime

语法:
touch [-acdmt] 文件

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

1693399194141

范例一:新建一个空文件并观察

1693399570917

注意到,上面这个文件的大小是 0。在默认情况下,如果 touch 后面有接文件,则该文件的三个时间都会更新成目前的时间。若该文件不存在,则会主动建立一个空的文件

image-20240320181957152

范例二&三:复制文件并检查日期,属性完全复制,并修改时间调整为两天前

1693399772634

总结:

通过 touch 这个命令,可以轻易地自定义文件的日期与时间,并且也可以建立一个新的文件。不过,需要注意的是,即使我们复制一个文件时,复制所有的属性,但也没有办法复制 ctime 这个属性。

touch 这个命令最常被使用的场景是:

  • 建立一个空文件
  • 将某个文件日期定义为目前(mtime 及 atime)
  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值