【5.0】Linux之文件管理

【一】系统目录结构

【1】文件组织方式

  • Windows: 以多根的方式组织文件 C: D:
  • Linux:以单根的方式组织文件 /

【2】存放命令相关的目录

  • /bin:
    • 存放普通用户使用的命令
    • 比如
      • /bin/ls用于列出当前目录的文件和文件夹
      • /bin/date用于显示系统日期和时间。
  • /sbin:
    • 存放管理员使用的命令
    • 比如
      • /sbin/service用于管理系统服务
      • /sbin/poweroff用于关机
      • /sbin/useradd用于添加用户。
  • 可以根据路径中的"bin"来识别存放可执行文件的目录。

【3】which 命令名

  • 使用which命令可以查找某个命令所在的路径
    • 例如which ls能够显示ls命令所在的路径。
  • 但是较为全面的信息可以使用whereis命令
    • 它不仅可以显示命令所在的路径,还可以显示可执行文件、帮助文档等的位置。

【4】存放用户相关数据的家目录

  • 比如:windows不同的用户登陆系统显示的桌面背景不一样

  • /home,普通用户的家目录, 默认为/home/dream

  • 环境变量的东西不要删,删掉试一下

  • /root,超级管理员root的家目录, 普通用户无权操作

  • 家目录用于存放用户的个人数据
  • 在Linux系统中
    • 普通用户的家目录默认为/home/username(username为具体的用户名)。
    • 超级管理员root的家目录为/root。
  • 环境变量等与用户相关的配置信息也存放在家目录中。

【5】系统文件目录

  • /usr,相当于C:Windows
  • /usr/local,软件安装的目录,相当于C:Program
  • /usr/bin/,普通用户使用的应用程序(重要)
  • /usr/sbin,管理员使用的应用程序(重要)
  • /usr/lib,库文件Glibc 32bit
  • /usr/lib64,库文件Glibc 64bit
  • /usr:类似于Windows的C:Program Files,用于存放系统相关的文件和目录。
  • /usr/local:用于存放本地安装的软件,相当于C:Program Files。
  • /usr/bin/:存放普通用户使用的应用程序,如常用的命令工具。
  • /usr/sbin:存放管理员使用的应用程序,包含一些系统管理工具。
  • /usr/lib:存放库文件,特指Glibc 32位版本。
  • /usr/lib**:存放不同硬件架构的库文件。

【6】启动目录

  • /boot 存放的系统启动相关的文件,例如:kernel,grub(引导装载程序)
  • linux内核+GUN软件

【7】配置文件目录

  • /etc,极其重要,后续所有服务的配置都在这个目录中
  • /etc/sysconfig/network-script/ifcfg-,网络配置文件
  • /etc/hostname,系统主机名配置文件,主机名很重要,有些特殊服务要依赖主机名,没有主机名会报错起不来;修改了要重启:reboot
  • /etc/resolv.conf,dns客户端配置文件,域名解析服务器,一般我们不配置,因为网卡的配置好了,会覆盖掉它,网卡的优先级高
  • /etc/hosts,本地域名解析配置文件,域名解析,先找自己的hosts,再去域名解析
  • /etc/motd :登录后显示的信息
  • /etc目录中存放着系统的各种配置文件,这是一个非常重要的目录。

  • 下面是一些常见的配置文件:

  • /etc/sysconfig/network-script/ifcfg-:网络配置文件。

  • /etc/hostname:系统主机名配置文件,修改主机名后需要重启系统。

  • /etc/resolv.conf:DNS客户端配置文件,用于设置域名解析服务器。

  • /etc/hosts:本地域名解析配置文件,可用于自定义域名解析。

  • /etc/motd:登录后显示的信息。

【8】可变的目录与临时目录

  • /var,存放一些变化文件,比如/var/log/下的日志文件,登陆日志,可以用来查看登录日志等信息
  • /var/tmp,进程产生的临时文件
  • /tmp,系统临时目录(类似于公共厕所),谁都可以使用
  • 1 查看登陆日志
    • cat /var/log/secure #查看登陆时间
  • 2 进程产生的临时文件(360清理垃圾,就是会清理)

【9】设备目录文件

  • /dev,存放设备文件,比如硬盘,硬盘分区,光驱,等等
  • /dev/sd 硬盘设备
  • /dev/null,黑洞设备,只进不出。类似于垃圾回收站
  • /dev/random,生成随机数的设备
  • /dev/zero,能远远不断的产生数据,类似于取款机,随时随地取钱

【10】虚拟的文件系统(如对应的进程停止则/proc下对应目录则会被删除)

  • /proc,反映系统当前进程的实时状态 :process
    • PS:类似于小汽车的仪表板,能够看到汽车是否有故障,或者是否缺油了
  • ls /proc # 可以看到很多id号,pid号,进程号,唯一
  • ls 进程id号的文件夹
    • 如果进程被关闭,id号的文件夹就没了
    • id号每次启动都不唯一,只有一个进程唯一,systemd 是进程号1的进程,所有进程都是基于它派生出来的

【11】其他

(1)media:提供设备的挂载点,媒体文件

  • linux 新增了盘符,需要手动挂载
  • 把光盘里的数据,挂载到media目录
mount  /dev/cdrom /media/

(2)mnt:提供设备的挂载点(同上)

(3)opt:第三方工具,第三方软件默认安装的(mysql...)

(4)run :下有pid,log结尾的文件

ls /run
  • cat /run/sshd.pid可以查看SSH服务的进程号
cat sshd.pid  # 进程运行的pid号,放在文件中
  • 过滤进程
ps aux |grep sshd
  • 此外,.lock文件在运行时起到锁定的作用,防止并发操作。
  • 如果有其他进程占用了锁,则会等待锁释放后再执行相应操作。
  • 假设现在执行
yum install tree

再开一个窗口执行相同命令

yum install tree
'''
Another app is currently holding the yum lock; waiting for it to exit...
  The other application is: yum
    Memory :  71 M RSS (470 MB VSZ)
    Started: Tue Aug 18 00:26:31 2020 - 00:24 ago
    State  : Sleeping, pid: 6191
'''
cat /run/yum.pid

【补充】动态链接库文件

  • win上能看到 xx.dll
  • linux上能看到 xx.so
  • 在Linux系统中
    • C和C++编写的程序经过编译后会产生两种文件
      • 一种是可执行文件
      • 另一种是动态链接库文件
  • 动态链接库文件的扩展名为.so,而Windows系统中对应的文件是.dll。
  • 动态链接库提供了一组函数的实现,可以被不同的程序共享使用,减少了代码重复性,提高了程序的可维护性和更新性。

【二】文件路径定位

【1】相对/绝对路径

  • 在Linux中,文件路径可以使用相对路径或绝对路径来定位。

  • 以下是关于相对路径和绝对路径的解释:

    • 相对路径:

      • 相对路径是相对于当前文件或者目录的路径。
      • 它是以当前位置为参考点来指定文件或目录的路径。
      • 使用相对路径时,可以省略根目录符号(/)。
    • 绝对路径:

      • 绝对路径是从根路径(/)开始的路径。
      • 它可以直接指明文件或目录的完整路径,并不依赖于当前位置。
  • 对于相对路径,可以使用以下示例进行说明:

# 当前路径为/home/user/
cd Documents     # 进入当前路径下的Documents目录
cd ./Pictures    # 进入当前路径下的Pictures目录
cd ../Music      # 进入当前路径上级目录的Music目录
  • 对于绝对路径,可以使用以下示例进行说明:
cd /usr/local/bin    # 进入绝对路径为/usr/local/bin的目录
cd /var/log         # 进入绝对路径为/var/log的目录
cd /home/user/Desktop   # 进入绝对路径为/home/user/Desktop的目录
  • 需要注意的是,/bin、/sbin、/lib目录都以软链接的形式链接到了/usr目录下。
    • 因此,在访问这些目录时,使用绝对路径时应该指向软链接所指向的目标目录
    • 示例如下:
cd /bin     # 实际上会跳转到/usr/bin目录
cd /sbin    # 实际上会跳转到/usr/sbin目录
cd /lib     # 实际上会跳转到/usr/lib目录

【2】. 和 .. 的区别

  • 在Linux中,.(点)和..(两个点)有特殊的含义:

    • . 表示当前路径。

      • 可以使用它来指代当前所在的目录。
    • .. 表示上一层目录。

      • 可以使用它来指代当前目录的父级目录。
  • 示例:

ls .         # 显示当前目录的内容
cd ..        # 进入当前目录的上级目录
cp file.txt ..   # 将当前目录的file.txt文件拷贝到上级目录

【3】cd切换文件操作

  • cd命令是用于切换当前工作目录的命令。

  • 以下是cd命令的常用选项:

    • cd:切换到当前用户的家目录(例如:/home/user)。对于root用户和普通用户,家目录是不同的。

    • cd -:切换回上一次所在的目录。

    • cd ~:切换到当前用户的家目录。与cd命令不带参数的效果相同。

    • cd .:代表当前目录。可以在拷贝、移动等操作中使用该命令。

    • cd ..:切换到当前目录的上级目录。

  • 示例:

cd /etc     # 切换到/etc目录
cd -        # 返回上一次所在的目录
cd ~        # 切换回当前用户的家目录
cd .        # 当前目录保持不变,一般用于拷贝、移动操作
cd ..       # 切换到当前目录的上级目录

【三】创建/复制/移动/删除

【1】文件创建命令touch

# touch file                    # 无则创建,有则修改时间
touch file
# 创建名为 "file" 的文件,如果该文件已存在,则更新文件的访问和修改时间为当前时间。

# touch file2 file3
touch file2 file3
# 同时创建名为 "file2" 和 "file3" 的文件。

# touch /home/test/file4 file5
touch /home/test/file4 file5
# 在 "/home/test/" 目录下创建名为 "file4" 的文件,以及当前工作目录下创建名为 "file5" 的文件。

# touch file{a,b,c}
touch file{a,b,c}
# 创建名为 "filea"、"fileb" 和 "filec" 的文件。

# touch file{1..10}
touch file{1..10}
# 创建名为 "file1"、"file2"、...、"file10" 的文件。

# touch file{a..z}
touch file{a..z}
# 创建名为 "filea"、"fileb"、...、"filez" 的文件。

# rm -rf fil*    #把fil开头的全删除
rm -rf fil*
# 强制递归删除当前目录中所有以 "fil" 为开头的文件和目录。
  • touch 命令用于创建空文件或者更新文件属性。
    • 如果文件已经存在,touch 命令会修改文件的访问和修改时间为当前时间
    • 如果文件不存在,则创建一个新文件。
  • 花括号 {} 可以用来创建一系列相关的文件名。
  • 通配符 * 用于匹配任意字符,可以与 rm 命令结合使用,删除满足特定模式的文件或目录。
    • 在示例中,命令 rm -rf fil* 删除所有以 "fil" 开头的文件和目录。
[root@dream ~]# cd /home
[root@dream home]# mkdir test
[root@dream home]# ls
admin  meng  test
[root@dream home]# cd test/
[root@dream test]# ls
[root@dream test]# touch file
[root@dream test]# ls
file
[root@dream test]# touch file2 file3
[root@dream test]# ls
file  file2  file3
[root@dream test]# touch /home/test/file4 file5
[root@dream test]# ls
file  file2  file3  file4  file5
[root@dream test]# touch file{a,b,c}
[root@dream test]# ls
file  file2  file3  file4  file5  filea  fileb  filec
[root@dream test]# touch file{1..10}
[root@dream test]# ls
file   file10  file3  file5  file7  file9  fileb
file1  file2   file4  file6  file8  filea  filec
[root@dream test]# rm -rf fil*
[root@dream test]# ls -l
total 0

【2】目录创建命令mkdir

# 选项:-v 显示详细信息  -p 递归创建目录
# mkdir dir1
mkdir dir1
# 在当前目录下创建名为 "dir1" 的目录。

# mkdir /home/test/dir2
mkdir /home/test/dir2
# 在 "/home/test" 目录下创建名为 "dir2" 的目录。

# mkdir -v /home/test/{dir3,dir4}
mkdir -v /home/test/{dir3,dir4}
# 在 "/home/test" 目录下同时创建名为 "dir3" 和 "dir4" 的目录,并显示创建过程的详细信息。

# mkdir -pv /home/test/dir5/dir6
mkdir -pv /home/test/dir5/dir6
# 递归地创建目录结构。在 "/home/test" 目录下创建 "dir5" 目录,在 "dir5" 目录下创建 "dir6" 目录。如果父级目录不存在,也会被创建。
# 同时,显示创建过程的详细信息。

# mkdir -pv /home/{test/{diu,but},boy}
mkdir -pv /home/{test/{diu,but},boy}
# 递归地创建目录结构。在 "/home" 目录下创建 "test" 和 "boy" 目录,在 "test" 目录下创建 "diu" 和 "but" 目录。
# 如果父级目录不存在,也会被创建。同时,显示创建过程的详细信息。

  • mkdir 命令用于创建一个新的目录。
  • 选项 -v 表示显示详细信息,可以查看创建过程的输出。
  • 选项 -p 表示递归地创建目录结构,即如果父级目录不存在,也会被创建。
  • 花括号 {} 可以用来创建一系列相关的目录名。
  • 在示例中,使用 -v 选项可以查看创建过程的详细信息,使用 -p 选项可以递归地创建目录结构。
[root@dream test]# ls -l
total 0
[root@dream test]# mkdir dir1
[root@dream test]# ls -l
total 0
drwxr-xr-x. 2 root root 6 Aug 21 11:00 dir1
[root@dream test]# mkdir /home/test/dir2
[root@dream test]# ls -l
total 0
drwxr-xr-x. 2 root root 6 Aug 21 11:00 dir1
drwxr-xr-x. 2 root root 6 Aug 21 11:01 dir2
[root@dream test]# # mkdir -v /home/test/{dir3,dir4}
[root@dream test]# ls -l
total 0
drwxr-xr-x. 2 root root 6 Aug 21 11:00 dir1
drwxr-xr-x. 2 root root 6 Aug 21 11:01 dir2
[root@dream test]# mkdir -v /home/test/{dir3,dir4}
mkdir: created directory ‘/home/test/dir3’
mkdir: created directory ‘/home/test/dir4’
[root@dream test]# ls -l
total 0
drwxr-xr-x. 2 root root 6 Aug 21 11:00 dir1
drwxr-xr-x. 2 root root 6 Aug 21 11:01 dir2
drwxr-xr-x. 2 root root 6 Aug 21 11:02 dir3
drwxr-xr-x. 2 root root 6 Aug 21 11:02 dir4
[root@dream test]# mkdir -pv /home/test/dir5/dir6
mkdir: created directory ‘/home/test/dir5’
mkdir: created directory ‘/home/test/dir5/dir6’
[root@dream test]# ls -l
total 0
drwxr-xr-x. 2 root root  6 Aug 21 11:00 dir1
drwxr-xr-x. 2 root root  6 Aug 21 11:01 dir2
drwxr-xr-x. 2 root root  6 Aug 21 11:02 dir3
drwxr-xr-x. 2 root root  6 Aug 21 11:02 dir4
drwxr-xr-x. 3 root root 18 Aug 21 11:02 dir5
[root@dream test]# mkdir -pv /home/{test/{diu,but},boy}
mkdir: created directory ‘/home/test/diu’
mkdir: created directory ‘/home/test/but’
mkdir: created directory ‘/home/boy’
[root@dream test]# ls -l
total 0
drwxr-xr-x. 2 root root  6 Aug 21 11:02 but
drwxr-xr-x. 2 root root  6 Aug 21 11:00 dir1
drwxr-xr-x. 2 root root  6 Aug 21 11:01 dir2
drwxr-xr-x. 2 root root  6 Aug 21 11:02 dir3
drwxr-xr-x. 2 root root  6 Aug 21 11:02 dir4
drwxr-xr-x. 3 root root 18 Aug 21 11:02 dir5
drwxr-xr-x. 2 root root  6 Aug 21 11:02 diu
[root@dream test]# 

【3】以树状显示目录结构命令tree

  • 安装插件
yum install tree
  • 命令
# 选项: -L: 显示目录树的层级
# tree /home/test/    #显示当前目录下的结构
/home/test/
├── but
├── dir1
├── dir2
├── dir3
├── dir4
├── dir5
│   └── dir6
└── diu
  • tree命令用于以树状形式显示目录结构,可以清晰展示文件和子目录的层次关系。
  • 通过安装 tree 插件,我们可以在Shell中使用 tree 命令。
  • 在示例中,使用 tree /home/test/ 命令可以显示 /home/test/ 目录下的内容。
  • 结果以树状结构展示,包括目录和子目录,并使用缩进表示层级关系。
[root@dream test]# tree /home/test/
/home/test/
├── but
├── dir1
├── dir2
├── dir3
├── dir4
├── dir5
│   └── dir6
└── diu

8 directories, 0 files

【4】cp复制

#选项: -v:详细显示命令执行的操作 -r: 递归处理目录与子目录 -p: 保留源文件或目录的属性

# cp file /tmp/file_copy
cp file /tmp/file_copy


# cp name /tmp/name         #不修改名称
# cp file /tmp/             #不修改名称
# cp -p file /tmp/file_p    #-p保持原文件或目录的属性
# cp -r  /etc/ /tmp/        #复制目录需要使用-r参数, 递归复制
# cp -rv /etc/hosts /etc/hostname /tmp  #拷贝多个文件至一个目录
# cp -rv /etc/{hosts,hosts.bak}
# cp -rv /etc/hosts{,-org}
  • cp 命令用于复制文件或目录。
  • 在示例中,cp file /tmp/file_copy 将当前目录下的 file 文件复制到 /tmp/ 目录下,并命名为 file_copy
  • 如果文件已经存在于目标位置,文件内容会被覆盖。
  • 如果目标路径是一个目录,则将源文件复制到目标目录下,并保持相同的文件名。
  • 使用 -v 选项可以显示详细的操作信息。
  • 若要复制目录及其子目录,需要使用 -r 递归处理目录与子目录。
  • 使用 -p 选项可以保留原文件或目录的属性,包括权限、所有者等。
  • 如果源文件是一个目录,需使用 -r 参数进行递归复制。
  • 可以同时复制多个文件至一个目录,如示例中的 cp -rv /etc/hosts /etc/hostname /tmp
  • 还可以使用花括号展开功能进行复制,例如 cp -rv /etc/{hosts,hosts.bak} 可以一次复制多个文件。
  • 类似地,使用花括号展开功能可以修改复制的文件名,如示例中的 cp -rv /etc/hosts{,-org}/etc/hosts 复制并重命名为 /etc/hosts-org

【5】mv移动

# mv file file1             #原地移动算改名

# mv file1 /tmp/            #移动文件至tmp目录
# mv /tmp/file1 ./          #移动tmp目录的文件至当前目录
# mv dir/ /tmp/             #移动目录至/tmp目录下

# touch file{1..3}
# mv file1 file2 file3 /opt/    #移动多个文件或至同一个目录

# mkdir dir{1..3}
# mv dir1/ dir2/ dir3/ /opt     #移动多个目录至同一个目录
  • mv 命令用于移动文件或目录,并可以同时用来重命名文件或目录。
  • 在示例中,mv file file1 将当前目录下的 file 文件重命名为 file1
  • 如果目标文件名已存在,则会被覆盖。
  • 如果目标路径是一个目录,则将源文件移动到目标目录,并保持相同的文件名。
  • 如果源路径和目标路径都是在同一个文件系统下,那么 mv 命令只是更改了文件名,实际上并没有对文件内容进行移动操作。这种情况下,可以将 mv 看作是文件重命名的一种方式。
  • 如果目标路径和源路径不在同一个文件系统下,那么 mv 命令会在两个文件系统之间,通过复制和删除的方式来完成文件的移动操作。
  • 此外,mv 命令还可以同时移动多个文件或目录至同一个目录,如示例中的 mv file1 file2 file3 /opt/ 可以将 file1file2file3 这三个文件移动到 /opt/ 目录下。
  • 同样地,可以将多个目录移动至同一个目录,如示例中的 mv dir1/ dir2/ dir3/ /opt

【6】rm删除

# rm file.txt      #删除文件, 默认rm存在alias别名,rm -i所以会提醒是否删除文件
rm file.txt
  • 执行结果:

    • 根据提示输入 yn 来确认是否删除文件。
  • rm 命令用于删除文件或目录。
  • 在示例中,rm file.txt 将删除当前目录下的 file.txt 文件。
  • 如果使用默认的 rm 命令,它通常带有 -i 选项的别名,即每次删除都会提示是否确认删除。因此,在执行命令后会得到一个提示 rm: remove regular file 'filename'?,需要输入 yn 来确认是否删除文件。
  • 可以通过添加 -f 选项来强制删除文件,不再进行确认操作。
  • 注意,删除后的文件将无法恢复,请谨慎使用。
# rm -r dir/        #递归删除目录,会提示
rm -r dir/
  • 执行结果:

    • 根据提示输入 yn 来确认是否删除目录及其内容。
  • 使用 -r 选项可以递归删除目录及其下的所有文件和子目录。
  • 在示例中,rm -r dir/ 将会删除当前目录下的 dir 目录及其内容。
  • 与删除文件一样,当使用默认的 rm 命令删除目录时,也会进行确认提示。因此,在执行命令后会得到一个提示 rm: remove directory 'dirname'?,需要输入 yn 来确认是否删除目录及其内容。
  • 类似地,可以通过添加 -f 选项来强制删除目录,不再进行确认操作。
# rm -rf dir/       #强制删除目录,不提醒(慎用)
rm -rf dir/
  • 执行结果:

    • 将强制删除目录及其内容,不再进行确认提示。
  • 当使用 -f-r 选项的组合 -rf 时,可以强制删除目录及其下的所有文件和子目录,而无需进行确认操作。
  • 注意,使用 -rf 选项非常危险,请谨慎使用。一旦删除,无法恢复。
# rm -f /home/dir10/  //不包括隐藏文件 
rm -f /home/dir10/
  • 执行结果:

    • 删除 /home/dir10/ 目录,但不包括隐藏文件。
  • 使用 rm -f 命令删除目录时,默认情况下不会删除目录中的隐藏文件,只会删除非隐藏文件和子目录。
  • 在示例中,rm -f /home/dir10/ 只会删除 /home/dir10/ 目录中的非隐藏文件,而隐藏文件 .file4 不会被删除。
  • 使用 -r 选项可以递归删除目录及所有文件和子目录,包括隐藏文件。
# rm -rf file 
rm -rf file
  • 执行结果:

    • 递归地强制删除名为 file 的文件。
  • 使用 -rf 选项可以同时进行递归删除和强制删除操作。
  • 在示例中,rm -rf file 将递归地强制删除当前目录下名为 file 的文件。
  • 类似地,可以使用 -rf 选项来递归地强制删除指定的目录。注意,这种操作也非常危险,请谨慎使用。

【四】查看文件内容(cat tac less more head tail tailf grep …)

【1】cat

# cat [文件名]
  • cat 命令用于查看文件内容。
  • 通过给定的文件名作为参数,cat 命令会将文件的内容输出到终端。
# cp /etc/passwd ./pass
# cat pass      #正常查看文件方式
# cat -n pass   #-n显示文件有多少行
# cat -A pass   #查看文件的特殊符号,比如文件中存在tab键
# tac pass      #倒序查看文件

【2】less、more

# less [文件名]
# more [文件名]
  • lessmore 是用于逐页查看长文本文件的命令。
  • 使用这两个命令可以按页浏览文件,支持上下翻动、空格进行翻页,并且可以随时退出查看。
# less /etc/services    #使用光标上下翻动,空格进行翻页,q退出
# more /etc/services    #使用回车上下翻动,空格进行翻页,q退出(有百分比)

【3】head

# head [文件名]
# head -n [行数] [文件名]
  • head 命令用于查看文件的头部内容,默认显示前十行。
  • 通过指定 -n 参数,可以查看文件的指定行数的头部内容。
# head pass     #查看头部内容,默认前十行
# head -n5 pass #查看头部5行,使用-n指定
# ps aux | head -5 # 只看头部5个进程

【4】tail

# tail [文件名]
# tail -n [行数] [文件名]
# tail -f [文件名]
# tailf [文件名]
  • tail 命令用于查看文件的尾部内容,默认显示最后10行。
  • 通过指定 -n 参数,可以查看文件的指定行数的尾部内容。
  • tail -f 可以动态地查看文件尾部的变化,并不断更新显示新的内容。
  • tailf 命令与 tail -f 功能相同,但是在某些系统中更常用。
# tail pass  # 查看文件尾部,默认10行
# tail -20 /var/log/secure  # 查看文件尾部20行
# tail -f /var/log/messages #-f动态查看文件尾部的变化
# tailf /var/log/messages   #查看文件尾部的变化
# ps aux | tail -2

【5】grep过滤文件内容

# grep [模式] [文件名]
# grep -i [模式] [文件名]
# grep -Ei [模式1|模式2] [文件名]
# grep -n -A [行数] [模式] [文件名]
# grep -n -B [行数] [模式] [文件名]
# grep -n -C [行数] [模式] [文件名]
  • grep 命令用于在文件中按模式搜索匹配的行,并将其打印输出。
  • 通过指定 -i 参数可以忽略大小写进行匹配。
  • 通过 -E 参数可以启用扩展正则表达式匹配。
  • 使用 -n 参数可以显示匹配行的行号。
  • -A 参数可以指定在匹配行之后显示的额外行数。
  • -B 参数可以指定在匹配行之前显示的额外行数。
  • -C 参数可以指定在匹配行前后都要显示的额外行数。
# grep "^root" pass     #匹配以root开头的行
# grep "bash$" pass     #匹配以bash结尾的行
# grep -i "ftp" pass    #忽略大小写匹配
# grep  -Ei "sync$|ftp" pass    #匹配文件中包含sync结尾或ftp字符串
# grep -n -A 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的下2行
# grep -n -B 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的上2行
# grep -n -C 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的上下2行

【6】上翻/下翻

control+b :下翻
control+f :上翻
  • control+b 可以向下翻页。
  • control+f 可以向上翻页。

【五】联网下载文件(wget、curl)

  • 可以使用 wgetcurl 命令在终端中联网下载文件。

【1】使用wget命令下载文件

  • wget 命令用于从指定的URL下载文件,并保存到本地。
  • 以下是 wget 命令的基本用法:
wget [选项] [URL]
  • 其中,[选项] 可以根据需要进行设置,[URL] 是要下载文件的地址。
  • 你也可以使用 -O 选项来指定文件的保存路径和名称。
  • 安装 wget 命令:
yum install wget -y
  • 示例:使用 wget 下载文件
wget -O /path/to/save/file http://example.com/file.zip
  • 以上命令将从 http://example.com/file.zip 下载文件,并保存到指定路径 /path/to/save/file

【2】使用curl命令下载文件

  • curl 命令可以用于通过URL获取文件内容,并将其输出到终端或保存到本地文件。
  • 以下是 curl 命令的基本用法:
curl [选项] [URL]
  • 其中,[选项] 可以根据需要进行设置,[URL] 是要下载文件的地址。
  • 你可以使用 -o 选项指定文件的保存路径和名称。
  • 安装 curl 命令:
yum install curl -y
  • 示例:使用 curl 下载文件
curl -o /path/to/save/file http://example.com/file.zip
  • 以上命令将从 http://example.com/file.zip 下载文件,并保存到指定路径 /path/to/save/file

【六】文件上传与下载(rz、sz)

  • 你可以使用 rzsz 命令在终端中进行文件上传和下载。

【1】使用rz命令上传文件

  • rz 命令可以用于上传文件到远程服务器。它允许你从本地计算机选择文件,并将其传输到远程服务器的当前工作目录。

    • 为了使用 rz 命令,你需要确保你已经在远程服务器上安装了 lrzsz 软件包。
  • 安装 lrzsz 软件包:

yum install lrzsz -y
  • 示例:使用 rz 命令上传文件
rz # 只能上传文件文件上传(不能大于4g)
  • 运行以上命令后,会出现一个文件选择对话框,你可以在本地计算机上选择要上传的文件。
  • 选中文件后,文件将被传输到远程服务器的当前工作目录。
  • 注意:rz 命令只能用于上传文件,不能上传大于4GB的文件。

【2】使用sz命令下载文件

  • sz 命令用于从远程服务器下载文件到本地计算机。

    • 它允许你选择要下载的文件,并将其保存到本地指定的路径。

    • 为了使用 sz 命令,你需要确保你已经在远程服务器上安装了 lrzsz 软件包。

  • 安装 lrzsz 软件包:

yum install lrzsz -y
  • 示例:使用 sz 命令下载文件
sz /path/to/file # 只能下载文件
  • 运行以上命令后,远程服务器上指定路径的文件将被下载到本地计算机,并保存在当前工作目录中。
  • 注意:sz 命令只能用于下载文件。
  • 请注意,rz和sz命令必须在支持sz / rz协议的终端或终端模拟器中运行以正常工作。
  • 这种协议用于在终端和远程计算机之间传输文件。

【七】文件或命令查找(locate、which、whereis、find)

【1】locate文件查找

# locate /etc/sh       #搜索etc目录下所有以sh开头的文件
# locate -i /etc/sh    #搜索etc目录下,所有以sh开头的文件,忽略大小写
# locate /etc/sh
  • 这个命令用于在整个文件系统中搜索以sh开头的文件。
    • 它会快速定位到匹配的文件路径并显示出来。
# locate -i /etc/sh
  • 加上-i参数后,locate命令会忽略大小写,即不区分大小写地搜索以sh开头的文件。

  • 案例:

$ locate /etc/sh
/etc/share
/etc/shells
  • 上述示例展示了搜索结果,显示了路径匹配到的文件或目录。

【2】which命令查找

# which ls  #查找ls命令的绝对路径

# whereis ls       //查找命令的路径、帮助手册、等
# whereis -b ls    //仅显示命令所在的路径,仅看二进制

# 对于内核相关的一些命令,用which whereis 是无法查询到的,需要使用type采查询
# type -a ls        #查看命令的绝对路径(包括别名)
# type -a for
# which ls
  • 该命令用于找到ls命令的绝对路径。
    • 当你在终端输入某个命令时,系统会根据环境变量的路径来寻找对应的可执行文件,并返回找到的可执行文件的完整路径。
# whereis ls
  • whereis命令用于查找命令的路径、帮助手册等相关信息。
    • 它会返回命令所在的二进制文件路径、源代码路径和帮助文档路径。
# whereis -b ls
  • 使用-b选项,whereis命令只会显示命令所在的二进制文件路径,而不会显示其他信息。
# type -a ls
  • type命令可以查看命令的绝对路径,包括命令的别名或函数。

    • 使用-a选项可以显示所有匹配到的命令。
  • 案例:

$ which ls
/bin/ls

$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz

$ whereis -b ls
/bin/ls

$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
  • 以上示例展示了四个命令分别查找ls命令的不同结果。
    • which命令返回了ls命令的绝对路径/bin/ls
    • whereis命令返回了ls命令的二进制文件路径/bin/ls和帮助文档路径/usr/share/man/man1/ls.1.gz
    • type -a命令显示了ls命令的别名ls --color=auto和绝对路径/bin/ls

【3】find命令

  • 用于在Linux系统中按照指定的条件查找文件和目录。
  • 它具有很多灵活的参数,可以根据文件名、类型、大小、日期等多种条件来搜索。

(1)基本语法:

find <路径> <表达式> <动作>
  • <路径>:指定要搜索的路径。可以是目录的路径,也可以是文件的路径。
  • <表达式>:定义了要搜索的条件。
  • <动作>:指定在找到匹配的文件后需要执行的操作。

(2)根据文件名搜索:

find /path/to/search -name "filename"
  • 例如,要在/home目录下找到所有名为file.txt的文件,可以使用如下命令:
find /home -name "file.txt"

(3)根据类型搜索:

find /path/to/search -type <类型>
  • 类型可以是以下之一:

    • f:普通文件

    • d:目录

    • l:符号链接

    • b:块设备

    • c:字符设备

    • s:套接字

    • p:管道

  • 例如,要在当前目录下找到所有的目录,可以使用如下命令:

find . -type d

(4)根据文件大小搜索:

find /path/to/search -size <大小>
  • <大小>可以用于定义具体的大小,如+100M表示大于100MB,或用于比较操作符,如-size +10k表示大于10KB。

  • 例如,要查找所有大于1GB的文件,可以使用如下命令:

find / -size +1G

(5)根据时间搜索:

find /path/to/search -<时间类型> <时间>
  • <时间类型>可以是以下之一:

    • -atime:访问时间

    • -mtime:修改时间

    • -ctime:改变时间

  • <时间>可以用于定义具体的时间

    • -7表示7天前,或用于比较操作符
    • -mtime +30表示30天前的文件。
  • 例如,要查找30天内修改过的文件,可以使用如下命令:

find /path/to/search -mtime -30

【八】字符处理命令(sort、uniq、cut、sed、awk、wc、)

【1】sort命令排序

  • sort命令用于对文本文件进行排序。
sort [OPTION]... [FILE]...
# -r:以倒序方式排序
# -n:按照数字排序
# -t:指定分隔符,默认为空格
# -k:指定排序的列

# 示例案例:
# 创建一个文件,写入无序内容
$ cat >> file.txt <<EOF
b:3
c:2
a:4
e:5
d:1
f:11
EOF

# 对文件内容进行排序
$ sort file.txt
a:4
b:3
c:2
d:1
e:5
f:11

# 使用特定分隔符和指定列进行排序
$ sort -t ":" -k2 file.txt
d:1
f:11
c:2
b:3
a:4
e:5

# 按照数字进行排序
$ sort -t ":" -n -k2 file.txt
d:1
c:2
b:3
a:4
e:5
f:11

# 更多示例:
# 下载文件 http://fj.xuliangwei.com/public/ip.txt,并对文件进行排序
$ sort -t. -k3.1,3.1nr -k4.1,4.3nr ip.txt

【2】uniq命令去重

  • uniq命令用于去除文件中相邻重复的行,并可统计重复行的次数。
uniq [OPTION]... [INPUT [OUTPUT]]
# -c:计算重复行的次数

# 示例案例:
# 创建一个file.txt文件
$ cat >> file2.txt <<EOF
abc
123
abc
123
EOF

# 使用sort和uniq组合,去除相邻重复的行
$ cat file.txt | sort | uniq
123
abc

# 使用-c参数统计每行内容的重复次数
$ cat file.txt | sort | uniq -c
      2 123
      2 abc

【3】cut命令截取字段

  • cut命令用于截取文件中的字段。
cut OPTION... [FILE]...
# -d:指定分隔符
# -f:指定需要提取的列

# 示例案例:
# 假设有一个文件file.txt包含以下内容:"Im lqz, is QQ 306334678"
# 我们希望过滤出文件中的lqz和306334678部分

# 使用cut命令,指定空格为分隔符,提取第2列和第5列
$ cut -d " " -f2,5 file.txt

# 使用cut、sed结合,将逗号替换为空格
$ cut -d " " -f2,5 file.txt | sed 's#,##g'

# 使用sed、awk结合,将逗号替换为空格
$ sed 's#,# #g' file.txt | awk -F " " '{print $2 " " $5}'

# 使用awk命令直接提取指定列
$ awk '{print $2,$5}' file.txt

# 使用awk命令指定分隔符提取指定列
$ awk '{print $2,$5}' file.txt | awk -F "," '{print $1,$2}'

【4】sed命令替换

  • sed命令用于在文本中进行文字替换。
sed 's###g'

# 示例案例:
# 假设有一个file.txt文件包含以下内容:"Im lqz, is QQ 306334678"
# 需要将逗号替换为空格

# 使用cut命令提取出逗号部分,并使用sed进行替换
$ cut -d " " -f2,5 file.txt | sed 's#,##g'

【5】awk命令提取字段

  • awk命令用于提取和处理文本中的字段。
awk '{print $2,$5}' file.txt
# -F 指定分隔符
awk '{print $2,$5}' file.txt | awk -F "," '{print $1,$2}'

# 示例案例:
# 假设有一个file.txt文件包含以下内容:"Im lqz, is QQ 306334678"
# 需要提取出lqz和306334678部分

# 使用awk命令提取指定列
$ awk '{print $2,$5}' file.txt

# 使用awk命令指定分隔符提取指定列
$ awk '{print $2,$5}' file.txt | awk -F "," '{print $1,$2}'

【6】wc命令统计行数

  • wc命令用于统计文件中的行、字节和单词数。
wc [OPTION]... [FILE]...
# -l:显示文件行数
# -c:显示文件字节数
# -w:显示文件单词数

# 示例案例:
# 统计/etc/fstab文件有多少行
$ wc -l /etc/fstab

# 统计/etc/services文件有多少行
$ wc -l /etc/services

# 统计当前路径下的文件和文件夹数量
$ ls | wc -l

# 更多示例:
# 使用grep结合wc命令统计文件行数
$ grep -n "." /etc/services | tail -1

# 使用awk结合wc命令统计文件行数
$ awk '{print NR " " $0}' /etc/services | tail -1

# 使用cat结合wc命令统计文件行数
$ cat -n /etc/services  | tail -1

【九】系统文件属性

【1】十列文件属性的解释

  • 当使用ls -l命令来列出目录下的文件时,输出结果以长格式显示,包含了文件的详细信息,我们称之为文件属性。
  • 下面是十列文件属性的解释:
[root@lqz ~]# ls -l ks.cfg
-rw-------. 1 root root 4434 May 30 13:58 ks.cfg
  • -rw-------.:①第一个字符表示文件类型,- 表示普通文件;后面的rw-------表示文件权限,其中rw-代表所有者(root)有读写权限,后面的-------代表其他用户没有任何权限。

  • 1:②文件的硬链接次数。此处为1,表示该文件有1个硬链接。

  • root:③文件所属用户。此处是root,表示该文件属于root用户。

  • root:④文件所属组。此处是root,表示该文件属于root用户组。

  • 4434:⑤文件的大小(单位为字节)。此处是4434字节,表示该文件的大小为4434字节。

  • May 30 13:58:⑥至⑦表示最新修改的日期和时间。此处的日期是5月30日,时间是13:58。

  • ks.cfg:⑨文件或目录的名称。此处是文件名为ks.cfg。

【2】回顾ls命令:

  • ls:列出目录内容的命令。

  • -l:以长格式显示文件信息的选项。

  • ks.cfg:要显示信息的文件名。

  • 下面是一个实际的例子,演示如何使用ls -l命令来查看文件属性:

$ ls -l test.txt
-rw-r--r-- 1 user1 group1 1024 Aug 20 09:30 test.txt
  • 以上命令输出了test.txt文件的属性:
    • -rw-r--r--:文件类型为普通文件,所有者有读写权限,所属组和其他用户只有读权限。

    • 1:文件的硬链接次数为1。

    • user1:文件所属用户为user1。

    • group1:文件所属组为group1。

    • 1024:文件的大小为1024字节。

    • Aug 20 09:30:文件的最新修改日期为8月20日09:30。

    • test.txt:文件的名称为test.txt。

【十】系统文件类型

  • 系统文件类型可以通过使用命令行工具来判断。
  • 之前已经提到了lsfile两个常用的工具。

【1】ls命令

  • 使用ls命令以长格式显示文件属性,通过第一列的第一个字符来判断文件具体的类型。
  • 下面是示例命令及其结果:
$ ll -d /etc/hosts /tmp /bin/ls  /dev/sda /dev/tty1 /etc/grub2.cfg /dev/log /run/dmeventd-client

-rwxr-xr-x.  1 root root 117656 Jun 30  2016 /bin/ls      # 普通文件
srw-rw-rw-.  1 root root      0 Jan 20 10:35 /dev/log    # 套接字文件
brw-rw----.  1 root disk   8, 0 Jan 20 10:36 /dev/sda    # 设备文件(块设备)
crw--w----.  1 root tty    4, 1 Jan 20 10:36 /dev/tty1   # 设备文件(字符设备)
lrwxrwxrwx.  1 root root     22 Jan 13 11:31 /etc/grub2.cfg -> ../boot/grub2/grub.cfg    # 链接文件
-rw-r--r--.  1 root root    199 Jan 20 11:03 /etc/hosts    # 普通文件
prw-------.  1 root root      0 Jan 20 10:36 /run/dmeventd-client    # 管道文件
drwxrwxrwt. 61 root root   8192 Jan 21 13:01 /tmp    # 目录文件

【2】file

  • file命令可以更精确地判断文件类型。下面是示例命令及其结果:
$ file /etc/hosts
/etc/hosts: ASCII text    # 文本文件

$ file /bin/ls
/bin/ls: ELF **-bit LSB executable, x86-**, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=aa7ff68f13de25936a098016243ce57c3c982e06, stripped    # 可执行文件

$ file /dev/sda
/dev/sda: block special    # 设备文件(块设备)

$ file /dev/tty1
/dev/tty1: character special    # 设备文件(字符设备)

$ file /etc/grub2.cfg
/etc/grub2.cfg: broken symbolic link to `../boot/grub2/grub.cfg'    # 链接文件

$ file /home
/home: directory    # 目录文件

$ file /run/dmeventd-client
/run/dmeventd-client: fifo (named pipe)    # 管道文件

$ file but
but: Zip archive data, at least v1.0 to extract    # 压缩文件
  • 综上所述,通过使用lsfile命令可以准确地判断文件的类型。
  • 需要注意的是,Linux文件扩展名并不代表文件类型,仅为了更好地识别文件的类型。

【3】小结

  • -rw-r--r--. 1 root root 35 7月 27 10:33 dream.txt
    • -rw-r--r--.
      • 第一个 - 表示文件类型(一会讲),后面的rwx,表示权限
    • 1
      • 硬链接次数
    • root
      • 文件属于哪个用户
    • root
      • 文件属于哪个组
    • 87811
      • 文件大小
    • 7月 27 10:33
      • 最新修改的时间与日期
    • dream.txt
      • 文件或目录名称
  • ll -d /etc/hosts /tmp /bin/ls /dev/sda /dev/tty1 /etc/grub2.cfg /dev/log /run/dmeventd-client
    • -
      • 普通文件(文本, 二进制, 压缩, 图片, 日志等)
    • d
      • 目录文件
    • b
      • 设备文件(块设备)存储设备硬盘 /dev/sda1, /dev/sda2
    • c
      • 设备文件(字符设备),终端 /dev/tty1, /dev/zero
    • s
      • 套接字文件, 进程间通信(socket)
    • p
      • 管道文件
    • l
      • 链接文件

【十一】系统链接文件

【1】引入

  • 文件有文件名与数据,在Linux上被分成两个部分:
    • 用户数据 (user data)
      • 即文件数据块 (data block),数据块是记录文件真实内容的地方,我们将其称为Block
    • 元数据 (metadata)
      • 即文件的附加属性,如文件大小、创建时间、所有者等信息。我们称其为Inode
  • 在Linux中,inode是文件元数据的一部分但其并不包含文件名,inode号即索引节点号)
  • 文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。
    • 图1.展示了程序通过文件名获取文件内容的过程。

  • Linux 系统引入了两种链接:
    • 硬链接 (hard link)
    • 软链接(又称符号链接,即 soft link 或 symbolic link)
  • ll -i
    • 查看inode

【2】什么是软链接

  • 软连接---》复制一份inode信息(win的快捷方式)
  • 软链接相当于Windows的快捷方式,软链接文件会将inode指向源文件的block,当我们访问这个软链接文件时,其实访问的是源文件本身。
  • 那么当我们对一个文件创建多个软链接,其实就是多个inode指向同一个block。
  • 当我们删除软链接文件时,其实只是删除了一个inode指向,并不会对源文件源文件造成影响,但如果删除的是源文件则会造成所有软链接文件失效。

【3】什么是硬链接

  • 硬连接---》只是复制了一份文件名
  • 若一个inode号对应多个文件名,则称这些文件为硬链接。
  • 换言之,硬链接就是同一个文件使用了多个别名
  • 如下图hard link 就是 file 的一个别名,他们有共同的 inode。

【4】软链接实践

(1)文件软链接

# 创建一个文件
touch /root/file

# 创建文件的软链接
ln -s /root/file /tmp/file_bak

# 查看软链接的属性
ls -l /tmp/file_bak
  • 在上面的示例中,我们创建了一个名为file的文件,并在/tmp目录下创建了一个名为file_bak的软链接,指向原始文件/root/file
  • 使用ls -l命令,我们可以查看软链接的详细属性。

(2)目录软链接

# 创建一个目录
mkdir /soft/nginx1.1 -p

# 创建目录的软链接
ln -s /soft/nginx1.1/ /soft/nginx

# 查看软链接的指向
ls -l /soft/nginx
  • 在上面的示例中,我们创建了一个名为nginx1.1的目录,并在/soft目录下创建了一个名为nginx的软链接,指向原始目录/soft/nginx1.1
  • 同样地,我们可以使用ls -l命令来查看软链接的指向。

(3)软链接的使用场景

  • 软件升级:
    • 在升级软件时,可以使用软链接将新版本的文件链接到旧版本的位置,从而实现无缝升级。
  • 企业代码发布:
    • 在企业代码发布过程中,可以使用软链接将代码库的不同版本链接到不同的服务器目录,以便实现快速切换和回滚。
  • 不方便目录移动:
    • 当某些目录由于某种原因不能直接移动时,可以使用软链接将目录链接到其他位置,以达到相同的效果
#
touch /root/file
ln -s /root/file /tmp/file_bak
ll /tmp/file_bak  //root下file链接到/tmp下并重命名为file_bak
  

#目录软链接示例
mkdir /soft/nginx1.1 -p
ln -s /soft/nginx1.1/ /soft/nginx
ll /soft/nginx   //查看链接指向

#软链接使用场景
1.软件升级
2.企业代码发布 
3.不方便目录移动

【5】硬链接实践

#文件硬链接示例
ln  /root/file /tmp/file_hard
ll /tmp/file_hard

#PS:目录不能创建硬链接,硬链接文件可以用rm命令删除

(1)硬链接

# 创建文件的硬链接
ln /root/file /tmp/file_hard

# 查看硬链接的属性
ls -l /tmp/file_hard
  • 在上面的示例中,我们使用ln命令创建了一个名为file_hard的硬链接,与原始文件/root/file指向相同的inode。
  • 使用ls -l命令,我们可以查看硬链接的详细属性。

【6】硬链接与软链接区别

1)ln命令创建硬链接,ln -s命令创建软链接。
2)目录不能创建硬链接,并且硬链接不可以跨越分区系统。
3)目录软链接特别常用,并且软链接支持跨越分区系统。
4)硬链接文件与源文件的inode相同,软链接文件与源文件inode不同。
5)删除软链接文件,对源文件及硬链接文件无任何影响。
6)删除文件的硬链接文件,对源文件及链接文件无任何影响。
7)删除链接文件的源文件,对硬链接无影响,会导致软链接失效。
8)删除源文件及其硬链接文件,整个文件会被真正的删除。

(1)ln命令创建硬链接,ln -s命令创建软链接。

  • 硬链接(Hard Link):
    • 硬链接是通过ln命令创建的链接。
    • 它们直接连接到文件的inode,并且与原始文件有相同的inode编号。
    • 硬链接可以看作是多个文件名指向同一块数据的不同入口。
    • 例如,创建硬链接的命令如下:
$ ln source_file hard_link
  • 软链接(Symbolic Link):
    • 软链接也称为符号链接,它是通过ln -s命令创建的链接。
    • 软链接是一个特殊的文件,其中包含指向源文件的路径信息。
    • 软链接实际上是一个指向原始文件的快捷方式。
    • 例如,创建软链接的命令如下:
$ ln -s source_file soft_link

(2)目录不能创建硬链接,并且硬链接不可跨越分区系统。

  • 硬链接:

    • 目录不能创建硬链接,硬链接只能链接到文件。
  • 软链接:

    • 软链接可以链接到目录,并且支持跨越分区系统。
    • 这意味着你可以在不同的分区之间创建软链接,并且访问目标目录的内容。

(3)目录软链接特别常用,并且软链接支持跨越分区系统。

  • 硬链接:

    • 由于目录不能创建硬链接,所以硬链接在目录方面使用较少。
  • 软链接:

    • 软链接在目录方面非常有用。
    • 通过软链接,你可以创建一个指向其他目录的快捷方式,方便快速访问。

(4)硬链接文件与源文件的inode相同,软链接文件与源文件inode不同。

  • 硬链接:

    • 硬链接是通过inode来连接到真正的文件数据的,所以硬链接的inode和源文件的inode是相同的。
  • 软链接:

    • 软链接是一个指向原始文件的路径信息,因此软链接的inode与源文件的inode是不同的。

(5)删除软链接文件,对源文件及硬链接文件无任何影响。

  • 软链接:
    • 当删除软链接时,只删除链接文件本身,并不影响源文件或硬链接文件。
    • 源文件和其他硬链接文件仍然存在。
$ rm soft_link

(6)删除文件的硬链接文件,对源文件及链接文件无任何影响。

  • 硬链接:
    • 当删除文件的硬链接时,源文件和其他硬链接文件仍然存在,并不受影响。
$ rm hard_link

(7)删除链接文件的源文件,对硬链接无影响,会导致软链接失效。

  • 硬链接:

    • 当删除链接文件的源文件时,硬链接并不受影响,并且仍然可以访问源文件的数据。
  • 软链接:

    • 当删除软链接指向的源文件时,软链接将失效,因为它指向的文件不存在了。

(9)删除源文件及其硬链接文件,整个文件会被真正删除。

  • 硬链接:
    • 当删除源文件以及所有硬链接文件时,文件的数据才会真正删除,释放磁盘空间。
$ rm source_file hard_link

【十二】Vim功能介绍

【1】什么是VIM

  • vi和vim是Linux下的一个文本编辑工具

  • VIM(Vi IMproved)是Linux下的一个文本编辑工具,相当于Windows系统下的记事本或Word文档。

  • 它是Vi编辑器的增强版。

【2】为什么要使用VIM?

  • 因为Linux系统一切皆为文件,而我们工作最多的就是修改某个服务的配置(其实就是修改文件内容)。
  • 也就是说如果没有vi/vim,我们很多工作都无法完成。
  • PS: vim是学习linux最重要的命令之一

【3】VI与VIM有什么区别?

  • vi和vim都是文本编辑器,只不过vim是vi的增强版,比vi多了语法高亮显示,其他编辑功能几乎无差,所以使用vi还是vim取决个人习惯。(相当于windows系统下的文本编辑软件“记事本”与”notepad++”的区别)
  • PS:因为前期最小化安装CentOS系统,所以默认情况下没有vim命令
  • 但可以使用yum install vim -y安装

【4】如何使用VIM编辑器?

  • 在使用VIM之前,我们需要先介绍下VIM的三种模式:
    • 普通模式、编辑模式、命令模式
  • 每种模式分别支持多种不同的快捷键,要想高效率地操作文本,就必须先搞清这三种模式的操作区别以及模式之间的切换方法。

【5】VIM模式三种模式介绍

1.普通模式:

  • 主要是控制光标移动,可对文本进行复制、粘贴、删除等工作。
  • 使用vim filename 编辑一个文件时,一进入该文件就是普通模式了。
  • 在这个模式下,可以进行光标移动、复制、删除、粘贴操作。

2.编辑模式:

  • 主要进行文本内容编辑和修改
  • 从普通模式进入编辑模式,只需你按一个键即可(i, I, a, A, o, O)
  • 当进入编辑模式时,会在屏幕的最下一行会出现 “INSERT”标记
  • 从编辑模式回到普通模式只需要按键盘左上方的 ESC 键即可。

3.末行模式:

  • 主要用于保存或退出文本。
  • 在普通模式下,输入 “:” 或者 “/“ 即可进入命令模式。
  • 在命令该模式下,可进行的操作有,显示行号、搜索、替换、保存、退出。

【6】vim编辑打开文件整体流程

  • 1.默认打开文件处于普通模式
  • 2.从普通模式切换至编辑模式需要使用a、i、o
  • 3.编辑模式修改完毕后需要先使用ECS返回普通模式
  • 4.在普通模式输入”:”或”/“进入命令模式,可实现文件的保存与退出。
  • PS: 在vim中,无法直接从编辑模式切换到命令模式。

【十三】VIM模式使用

【1】普通模式

(1)命令光标跳转

G        #光标跳转至末端
gg       #光标跳转至顶端
5gg      #光标跳转至当前文件内的第5行
$        #光标跳转至当前光标所在行的尾部
0        #光标跳转至当前光标所在行的首部
  • G:跳转至文件末尾
  • gg:跳转至文件开头
  • Ngg:跳转至当前文件内的第N行
  • $:跳转至当前行的末尾
  • ^ 或者 0:跳转至当前行的开头

(2)文件内容较多

ctrl+f  #往下翻页(行比较多)
ctrl+b  #往上翻页
  • ctrl+f:向下翻页(适用于行数较多的情况)
  • ctrl+b:向上翻页

(3)复制与粘贴

yy       #复制当前光标所在的行
5yy      #复制当前光标以及光标向下4行

p        #粘贴至当前光标下一行   
P        #粘贴至当前光标上一行
  • yy:复制当前行
  • Nyy:复制当前行及往下的N-1行
  • p(小写):粘贴至当前光标下一行
  • P(大写):粘贴至当前光标上一行

(4)删除、剪贴、撤销

dd       #删除当前光标所在的行   
4dd      #删除当前光标所在的行及往下的3行
dG       #删除当前光标以后的所有行
D        #删除当前光标及之后的内容  
x        #删除当前光标标记之后的字符
X        #删除当前光标标记之前的字符
dd & p   #剪切、先删除dd(number dd),后粘贴p
u        #撤销上一次操作
  • dd:删除当前行
  • Ndd:删除当前行及往下的N-1行
  • dG:删除当前光标后的所有行
  • D:删除当前光标及之后的内容
  • x:删除当前光标后的字符
  • X:删除当前光标前的字符
  • u:撤销上一次操作

(5)替换

r        #替换当前光标标记的单个字符
R        #进入REPLACE模式,连续替换,ESC结束
  • r:替换当前光标标记的单个字符
  • R:进入REPLACE模式,连续替换(按ESC键结束)

【2】编辑模式(从普通模式进入到编辑模式)

i   #进入编辑模式,光标不做任何操作
a   #进入编辑模式,将当前光标往后一位
o   #进入编辑模式,并在当前光标下添加一行空白内容


I   #进入编辑模式,并且光标会跳转至本行的头部
A   #进入编辑模式,将光标移动至本行的尾部
O   #进入编辑模式,并在当前光标上添加一行空白内容
  • i:在当前光标位置前插入
  • a:在当前光标位置后追加
  • o:在当前光标下插入一行空白内容
  • I:在当前行首插入
  • A:在当前行尾追加
  • O:在当前行上方插入一行空白内容

【3】命令模式(主要用于搜索/保存/退出文件)

(1)文件保存与退出

:w       		#保存当前状态
:w!      		#强制保存当前状态
:q       		#退出当前文档(文档必须保存才能退出)
:q!      		#强制退出文档不会修改当前内容
:wq      		#先保存再退出
:wq!     		#强制保存并退出
:x       		#先保存再退出
ZZ       		#保存退出, shfit+zz    
:number  		#跳转至对应的行号
:set nu  		#显示行号
:set nonu		#不显示行号
  • :w:保存当前状态
  • :w!:强制保存当前状态
  • :q:退出当前文档(需要先保存)
  • :q!:强制退出文档(不保存)
  • :wq:先保存再退出
  • :wq!:强制保存并退出
  • :x:先保存再退出
  • ZZ:保存并退出文件(快捷方式,按Shift+zz)

(2)文件内容查找

/string #需要搜索的内容(查找)
n       #按搜索到的内容依次往下进行查找
N       #按搜索到的内容依次往上进行查找
  • /string:搜索指定内容的字符串
  • n:顺序向下查找匹配内容
  • N:顺序向上查找匹配内容

(3)文件内容替换

:1,5s#sbin#test#g   #将1-5行中所有的 "sbin" 替换为 "test"
:1,5s#sbin#test#    #将1-5行中第一个出现的 "sbin" 替换为 "test"
:%s#sbin#test#g     #将整个文件中所有的 "sbin" 替换为 "test"
:%s#sbin#test#gc    #全局替换并提示是否需要替换
  • 这些命令用于在Vim编辑器中进行文件内容的替换操作。
  • 替换命令的基本语法是 :[range]s/pattern/replacement/[flags]
    • 其中 pattern 是要查找的内容
    • replacement 是要替换成的内容
    • flags 是可选的标志。
  • 示例: 假设有以下文本文件内容:
1. sbin
2. sbin
3. sbin
4. sbin
5. sbin
  • 执行命令 :1,5s#sbin#test#g 后,文件变为:
1. test
2. test
3. test
4. test
5. test
  • 执行命令 :1,5s#sbin#test# 后,文件变为:
1. test
2. sbin
3. sbin
4. sbin
5. sbin
  • 执行命令 :%s#sbin#test#g 后,文件变为:
1. test
2. test
3. test
4. test
5. test
  • 执行命令 :%s#sbin#test#gc 后,将逐个匹配替换,提示是否替换:
1. test (y/n/a/q/l/^E/^Y)?
  • 在提示中
    • 可以选择替换(y)
    • 不替换并进入下一个匹配(n)
    • 替换所有剩余的匹配(a)
    • 结束替换过程(q)
    • 向后查找匹配(l)
    • 向前查找匹配(^E)
    • 显示剩余的匹配(^Y)

(4)文件内容另存

:w /root/test.txt  #将当前文件内容另存为 /root/test.txt 文件
  • 这个命令用于将当前编辑的文件内容另存为指定的文件。
  • 使用 :w 命令可以将文件保存,后面跟上文件路径即可另存为指定路径的文件。
  • 示例:
    • 假设当前正在编辑一个名为 example.txt 的文件,并且想将其另存为 /root/test.txt
    • 执行命令 :w /root/test.txt 即可将文件内容保存到 /root/test.txt

(5)文件内容读入

:r  /etc/hosts  #将 /etc/hosts 文件的内容插入到当前光标所在行的下面
:5r /etc/hosts  #将 /etc/hosts 文件的内容插入到当前文件的第五行下面
  • 这些命令用于将指定文件的内容读入到当前编辑的文件中。
  • 示例:
    • 假设当前正在编辑一个文件,并且要在当前光标所在行的下面插入 /etc/hosts 文件的内容
    • 执行命令 :r /etc/hosts 即可实现。
  • 假设当前正在编辑一个文件,并且要将 /etc/hosts 文件的内容插入到当前文件的第五行下面
    • 执行命令 :5r /etc/hosts 即可实现。

【4】视图模式(从普通模式进入视图模式),主要进行批量操作

(1)ctrl+v 进入可视块模式,选中需要注释的行

  • 1.插入:按shift+i进入编辑模式,输入#,结束按ESC键
  • 2.删除:选中内容后,按x或者d键删除
  • 3.替换:选中需要替换的内容, 按下r键,然后输入替换后的内容

(2)shift+v 进入可视行模式,选中整行内容

  • 1.复制:选中行内容后按y键及可复制。
  • 2.删除:选中行内容后按d键删除。

【十四】VIM扩展知识

【1】环境变量临时生效

:set nu             #显示行号
:set ic             #忽略大小写, 在搜索的时候有用
:set ai             #自动缩进
:set list           #显示制表符(空行、tab键)
:set no[nu|ic|ai…]  #取消临时设定的变量
  • 显示行号::set nu
  • 忽略大小写,在搜索时非常有用::set ic
  • 自动缩进::set ai
  • 显示制表符、空行和Tab键::set list
  • 取消临时设定的环境变量,例如取消行号设置::set nonu

【2】环境变量永久生效。

  • ~/.vimrc 个人环境变量(优先级高)
  • /etc/vimrc 全局环境变量
# vim  ~/.vimrc #当下次再打开文件自动显示行号并忽略大小写
set nu
set ic

#如果个人vim环境没有配置, 则使用全局vim环境变量配置。
#如果个人vim环境和全局环境变量产生冲突, 优先使用个人vim环境变量。

【3】如何同时编辑多个文件

vim -o file1 file2  #水平分割
vim -O file1 file2  #垂直分割

#ctrl+ww 文件间切换
  • 在Vim中,你可以使用以下命令来同时编辑多个文件:

    • 水平分割打开文件:
      • vim -o file1 file2 这会将 file1 和 file2 水平分割在不同的窗口中,并同时编辑这两个文件。
    • 垂直分割打开文件:
      • vim -O file1 file2 这会将 file1 和 file2 垂直分割在不同的窗口中,并同时编辑这两个文件。
  • 在打开多个文件后,你可以使用 ctrl+ww 快捷键在不同的文件之间进行切换。

  • 例如,要同时编辑 file1 和 file2,可以在终端中输入以下命令:

【4】相同文件之间差异对比

  • 相同文件之间差异对比,通常用于对比修改前后差异
# diff      #文件对比   
# vimdiff   #以vim方式打开两个文件对比,高亮显示不同的内容
  • 文件对比:diff

    • 以 Vim 方式打开两个文件并进行差异对比:vimdiff
  • 文件对比:diff

    • 可以使用 diff 命令进行文件的对比。
    • 该命令会显示出两个文件之间的差异,并标识出不同的内容。
  • 以 Vim 方式打开两个文件并进行差异对比:vimdiff

    • 使用 vimdiff 命令可以以 Vim 的方式打开两个文件进行差异对比。
    • Vimdiff 会高亮显示不同的内容,并方便地进行修改和合并操作。
  • 例如,要对比文件 file1 和 file2 的差异,可以在终端中输入以下命令:

    vimdiff file1 file2
    

【5】非正常退出后处理.swp文件

  • 如果在Vim中发生非正常退出(例如使用 ctrl+z 挂起或强制退出终端),可能会留下一个名为 .filename.swp 的临时文件,其中 filename 是你编辑的文件的名称。
  • 为了解决此问题,你可以执行以下命令来删除同名的 .swp 文件:
#假设打开filename文件被以外关闭,需要删除同文件名的.swp文件即可解决
# rm -f .filename.swp
  • 通过运行上述命令,你可以删除产生的 .swp 文件,以避免后续的冲突或错误。
  • 请记住,.swp 文件通常用于在 Vim 正常退出前自动保存未保存的更改,因此在非正常退出后可以使用 .swp 文件来恢复丢失的数据。

【十五】VIM练习示例

【1】练习一

1.将/etc/passwd 复制到/root/目录下,并重命名为test.txt
2.用vim打开test.txt并显示行号
3.分别向下、向右、向左、向右移动5个字符,分别向下、向上翻两页
4.把光标移动到第10行,让光标移动到行末,再移动到行首,移动到test.txt文件的最后一行,移动到文件的首行
5.搜索文件中出现的 root 并数一下一共出现多少个,不区分大小写搜索
6.把从第一行到第三行出现的root 替换成–od–,然后还原上一步操作
8.把整个文件中所有的root替换成–od–
9.把光标移动到20行,删除本行,还原上一步操作
10.删除第19行,还原上一步操作
11.删除从5行到10行的所有内容,还原上一步操作
12.复制2行并粘贴到11行下面,还原上一步操作(按两次u)
13.复制从11行到15行的内容并粘贴到8行上面,还原上一步操作(按两次u)
14.把13行到18行的内容移动文件的尾部,还原上一步操作(按两次u)
15.光标移动到首行,把/sbin/nologin改成/bin/bash
16.在第一行下面插入新的一行,并输入”# Hello!”
17.保存文档并退出

【2】练习示例2

(1)文件

[root@www ~]# cat proxy.conf
server {
    Listen 8080;
    Server_Name vim.OldboyEDU.com;
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forward-for;
        proxy_intercept_errors on;
        proxy_next_upstream error timeout;
        proxy_next_upstream_timeout 3s;
        proxy_next_upstream_tries 2;
        error_page 500 502 403 404 = /proxy_error.html;
    }
    location = /proxy_error.html {
        root /code/proxy;
    }
}

(2)题目

1.使用vim打开proxy.conf文件
2.修改Listen为listen小写,并将8080修改为80
3.修改ServerName为server_name小写。
4.修改vim.OldboyEDU.com为vim.oldboy.com
5.在server_name行下插入一行 root /code;
5.复制5-14行的内容,然后将其粘贴到14行下面
6.删除与proxy_set_header相关的两行全部删除
7.如上操作完成后,在13-20行前面加上#号
8.删除21-23的行,然后保存当前文件

【3】解析

(1)练习一

1.将/etc/passwd 复制到/root/目录下,并重命名为test.txt

cp /etc/passwd /root/test.txt
  • 在上述命令中,cp 是用于复制文件的命令,/etc/passwd 是要复制的源文件路径,/root/test.txt 是复制后的目标文件路径。
  • 通过执行此命令,/etc/passwd 文件将被复制到 /root/ 目录下,并重命名为 test.txt

2.用vim打开test.txt并显示行号

vim -N /root/test.txt
  • 上述命令中,vim 是打开 Vim 编辑器的命令,-N 参数用于显示行号,/root/test.txt 是要打开的文件路径。
  • 通过执行此命令,使用 Vim 打开了 test.txt 文件,并显示了行号。

3.分别向下、向右、向左、向右移动5个字符,分别向下、向上翻两页

使用下列命令和操作实现:

  • 向下移动5行:按下 5j
  • 向右移动5个字符:按下 5l
  • 向左移动5个字符:按下 5h
  • 向右移动5个字符:按下 5l
  • 向下翻两页:按下 2Ctrl + D
  • 向上翻两页:按下 2Ctrl + U

4.把光标移动到第10行,让光标移动到行末,再移动到行首,移动到test.txt文件的最后一行,移动到文件的首行

使用下列命令和操作实现:

  • 移动到第10行:按下 10G:10
  • 移动到行末:按下 $
  • 移动到行首:按下 0
  • 移动到文件的最后一行:按下 G:$
  • 移动到文件的首行:按下 gg:1

5.搜索文件中出现的 root 并数一下一共出现多少个,不区分大小写搜索

grep -i -o 'root' /root/test.txt | wc -l
  • 上述命令中,grep 是用于在文件中搜索匹配模式的命令,-i 参数表示不区分大小写,-o 参数表示只输出匹配到的部分,'root' 是要搜索的模式,/root/test.txt 是要搜索的文件路径,wc -l 用于计算匹配到的行数。
  • 通过执行此命令,可以搜索文件中出现的 "root" 并输出该单词出现的总次数。

6.把从第一行到第三行出现的root 替换成–od–,然后还原上一步操作

sed -i '1,3 s/root/-od-/' /root/test.txt
  • 上述命令中,sed 是用于进行文本替换的流编辑器,-i 参数表示直接修改源文件,'1,3 s/root/-od-/' 是指在第一行到第三行之间将所有的 "root" 替换为 "-od-",/root/test.txt 是要进行替换的文件路径。通过执行此命令,可以实现替换操作。

  • 如果需要还原上一步操作,可以使用 Git 进行版本控制或者使用 Vim 的撤销命令 u

8.把整个文件中所有的 root 替换成–od–

sed -i 's/root/-od-/g' /root/test.txt
  • 上述命令中,s/root/-od-/g 指示将文件中所有的 "root" 替换为 "-od-",/root/test.txt 是要进行替换的文件路径。
  • 通过执行此命令,文件中的所有 "root" 都会被替换为 "-od-"。

9.把光标移动到20行,删除本行,还原上一步操作

先移动到第20行再删除本行:

  • 移动到第20行:按下 20G:20
  • 删除本行:按下 dd

要还原上一步操作,可以使用 Vim 的撤销命令 u

10.删除第19行,还原上一步操作

sed -i '19d' /root/test.txt
  • 上述命令中,dsed 命令的删除操作符,19d 表示删除第19行,/root/test.txt 是要进行删除操作的文件路径。

  • 通过执行此命令,可以删除第19行。

  • 要还原上一步操作,可以使用 Git 进行版本控制或者使用 Vim 的撤销命令 u

11.删除从5行到10行的所有内容,还原上一步操作

sed -i '5,10d' /root/test.txt
  • 上述命令中,5,10d 表示删除从第5行到第10行的所有内容,/root/test.txt 是要进行删除操作的文件路径。
  • 通过执行此命令,可以删除指定行数范围内的内容。
  1. 复制2行并粘贴到11行下面,还原上一步操作(按两次u)
  • 命令:yy;p;p

  • 解释:yy命令用于复制当前行,p命令用于在当前行的下方粘贴复制的内容。因此,yy;p;p表示将当前行复制两次并粘贴到当前行的下方。

  • 案例:

$ cat file.txt
1. Line 1
2. Line 2
3. Line 3
4. Line 4
5. Line 5

$ vi file.txt
# 光标在第2行
yy;p;p

$ cat file.txt
1. Line 1
2. Line 2
2. Line 2
2. Line 2
3. Line 3
4. Line 4
5. Line 5

还原上一步操作的方法是按两次撤销命令(通常是按下u键),这将撤销上述复制和粘贴操作。

  1. 复制从11行到15行的内容并粘贴到8行上面,还原上一步操作(按两次u)
  • 命令:11,15y;8p

  • 解释:11,15y命令用于复制从第11行到第15行的内容,8p命令用于在第8行的上方粘贴复制的内容。因此,11,15y;8p表示将第11行到第15行的内容复制并粘贴到第8行的上方。

  • 案例:

$ cat file.txt
1. Line 1
2. Line 2
3. Line 3
4. Line 4
5. Line 5

$ vi file.txt
# 光标在第1行
11,15y;8p

$ cat file.txt
1. Line 1
2. Line 2
3. Line 3
4. Line 4
5. Line 5
6. Line 11
7. Line 12
8. Line 13
9. Line 14
10. Line 15
11. Line 2
12. Line 3
13. Line 4
14. Line 5

还原上一步操作的方法是按两次撤销命令(通常是按下u键),这将撤销上述复制和粘贴操作。

  1. 把13行到18行的内容移动文件的尾部,还原上一步操作(按两次u)
  • 命令:13,18m$

  • 解释:13,18m$命令用于将第13行到第18行的内容移动到文件的尾部。其中,m表示移动行的命令,$表示文件的尾部。

  • 案例:

$ cat file.txt
1. Line 1
2. Line 2
3. Line 3
4. Line 4
5. Line 5
6. Line 11
7. Line 12
8. Line 13
9. Line 14
10. Line 15
11. Line 2
12. Line 3
13. Line 4
14. Line 5

$ vi file.txt
# 光标在第1行
13,18m$

$ cat file.txt
1. Line 1
2. Line 2
3. Line 3
4. Line 4
5. Line 5
6. Line 11
7. Line 12
8. Line 2
9. Line 3
10. Line 4
11. Line 5
12. Line 13
13. Line 14
14. Line 15
  • 还原上一步操作的方法是按两次撤销命令(通常是按下u键),这将撤销上述移动操作。
  1. 光标移动到首行,把/sbin/nologin改成/bin/bash
  • 命令:gg/\sbin/nologin/s///bin/bash

  • 解释:gg命令用于将光标移动到首行,/\sbin/nologin/用于搜索第一个出现的字符串"/sbin/nologin",s命令用于将搜索到的字符串替换为"/bin/bash"。

  • 案例:

$ cat file.txt
/sbin/nologin
Line 2
Line 3

$ vi file.txt
# 光标在第1行
gg/\sbin\/nologin/s//\/bin\/bash

$ cat file.txt
/bin/bash
Line 2
Line 3
  1. 在第一行下面插入新的一行,并输入”# Hello!”
  • 命令::2put!="# Hello!"

  • 解释::2put!命令用于在当前行的下方插入文本,"# Hello!"表示要插入的文本内容。

  • 案例:

$ cat file.txt
Line 1
Line 2
Line 3

$ vi file.txt
# 光标在第1行
:2put!="# Hello!"

$ cat file.txt
Line 1
# Hello!
Line 2
Line 3
  1. 保存文档并退出
  • 命令::wq

  • 解释::wq命令用于保存对文档的修改并退出Vi编辑器。

  • 案例:

# 光标在文档中,没有命令行提示符
:wq

# 文档已保存并退出Vi编辑器

(2)练习二

  1. 使用vim打开proxy.conf文件:
vim proxy.conf
  1. 修改Listen为listen小写,并将8080修改为80:
:%s/Listen/listen/g             # 将Listen替换为小写的listen
:%s/8080/80/g                   # 将8080替换为80
  1. 修改ServerName为server_name小写,并将vim.OldboyEDU.com修改为vim.oldboy.com:
:%s/Server_Name/server_name/g   # 将Server_Name替换为小写的server_name
:%s/vim\.OldboyEDU\.com/vim.oldboy.com/g    # 将vim.OldboyEDU.com替换为vim.oldboy.com,注意其中的点需要转义
  1. 在server_name行下插入一行root /code;:
13a                              # 在第13行后插入
root /code;                      # 输入要插入的内容
.
  1. 复制5-14行的内容,然后将其粘贴到14行下面:
5,14y                           # 复制5-14行的内容
14p                             # 在14行下面粘贴复制的内容
  1. 删除与proxy_set_header相关的两行全部删除:
11,12d                          # 删除11-12行
  1. 如上操作完成后,在13-20行前面加上#号:
13,20s/^/# /                    # 在13-20行前面添加#号注释
  1. 删除21-23的行,然后保存当前文件:
21,23d                          # 删除21-23行
:wq                             # 保存文件并退出vim编辑器
posted @ 2023-08-22 09:57  Chimengmeng  阅读(94)  评论(0编辑  收藏  举报