1、目录树结构,常见目录的作用,课堂课件

Linux 目录树结构及常见目录的作用

根目录 (/)

  • 作用:根目录是整个文件系统的起始点,所有其他文件和目录都位于根目录下。以 / 开头的路径是相对根目录的路径。

/bin

  • 作用:存放基本的系统命令和程序,这些命令是系统启动和日常操作所必须的。所有用户都可以执行这些程序。
  • 示例
    • /bin/bash:默认的 shell 程序。
    • /bin/ls:列出目录内容的命令。

/sbin

  • 作用:存放系统管理命令,主要由管理员(root 用户)使用。这些命令通常用于系统维护和修复。
  • 示例
    • /sbin/reboot:重新启动系统。
    • /sbin/ifconfig:配置网络接口。

/etc

  • 作用:存放系统的配置文件。它包括操作系统的设置、服务配置和系统管理所需的文件。
  • 示例
    • /etc/passwd:存储用户账户信息。
    • /etc/fstab:存储文件系统的挂载信息。

/home

  • 作用:存放用户的家目录。每个用户都会有一个子目录,存放该用户的个人文件和配置文件。
  • 示例
    • /home/alex:用户 alex 的家目录。

/root

  • 作用:是 root 用户的家目录。只有 root 用户可以访问该目录。
  • 示例
    • /root/.bashrc:root 用户的 bash 配置文件。

/lib/lib64

  • 作用:存放共享库文件,这些文件是系统和程序运行所需要的动态库文件。
    • /lib 存放 32 位库文件;
    • /lib64 存放 64 位库文件。
  • 示例
    • /lib/x86_64-linux-gnu/libc.so.6:C 标准库文件。

/var

  • 作用:存放系统运行时会变动的数据文件。包括日志文件、缓存、临时文件、邮件等。
    • /var/log:存放系统日志。
    • /var/spool:存放邮件、打印等队列。

/tmp

  • 作用:存放临时文件。这里的文件通常在系统重启后被删除。
  • 示例
    • /tmp/tempfile:临时文件。

/dev

  • 作用:存放设备文件,用于访问系统硬件设备(如硬盘、终端等)。
  • 示例
    • /dev/sda:硬盘设备。
    • /dev/tty:终端设备。

/mnt/media

  • 作用
    • **/mnt**:用于临时挂载文件系统,管理员可以在这里挂载外部存储设备。
    • **/media**:用于自动挂载可移动存储设备(如 USB 驱动器、光盘等)。
  • 示例
    • /mnt/usb:挂载的 USB 设备。
    • /media/cdrom:挂载的 CD-ROM。

/opt

  • 作用:存放第三方应用程序包,通常用于安装额外的软件。
  • 示例
    • /opt/google:Google 的软件包安装目录。

/usr

  • 作用:存放系统的共享数据、应用程序和库文件。/usr 目录通常包含程序、库和系统的其他文件。
  • 示例
    • /usr/bin:常用的应用程序。
    • /usr/lib:共享库文件。

/sys

  • 作用:提供内核的实时信息。它显示了内核的数据结构和设备信息。
  • 示例
    • /sys/class:内核的设备类信息。
    • /sys/devices:内核的设备信息。

/proc

  • 作用:是一个虚拟文件系统,提供内核和进程的实时信息。它并不存储实际的文件数据,而是内核生成的虚拟信息。
  • 示例
    • /proc/cpuinfo:CPU 信息。
    • /proc/meminfo:内存使用信息。

总结

Linux 文件系统的根目录(/)是所有文件和目录的起点,各个子目录存放不同类型的文件。通过理解每个目录的作用,可以更好地管理和使用 Linux 系统。常见的目录包括:

  • /bin:基础命令。
  • /sbin:系统管理命令。
  • /etc:配置文件。
  • /home:用户目录。
  • /var:变动数据文件。
  • /dev:设备文件。
  • /tmp:临时文件。
  • /usr:共享文件。

如果你有其他问题,随时可以问我!

2.文件权限的表示方法,字符型和八进制型分别如何表示,文件和目录的最小权限分别是什么?预习课件,课堂课件

文件权限的表示方法

Linux 文件权限有两种表示方法:字符型(symbolic)和 八进制型(octal)。

1. 字符型表示(Symbolic Representation)

字符型权限使用字母表示,每个权限由 3 个字符组成,表示 用户(owner)组(group)其他人(others) 的权限。每组权限由 3 个字母表示:r(read,读权限)、w(write,写权限)和 x(execute,执行权限)。

权限字符说明:

  • r:读权限,表示可以读取文件内容,或列出目录中的文件。
  • w:写权限,表示可以修改文件内容,或在目录中添加、删除文件。
  • x:执行权限,表示可以执行文件(如果是脚本或可执行文件),或者进入目录。

字符型权限表示方法:

  • rwxr-xr-- 说明:
    • 用户(owner)有 权限,但没有 执行 权限;
    • 用户组(group)和其他人(others)都有 权限,但没有 执行 权限。

字符型权限格式
[用户权限][组权限][其他权限]

示例

1
rwxr-xr--
  • 用户权限rwx(读、写、执行)
  • 组权限r-x(读、执行)
  • 其他权限r--(只读)

2. 八进制型表示(Octal Representation)

八进制表示法使用三个数字,每个数字表示用户、组和其他人的权限。每一位的数字对应一个权限组合,采用 0 到 7 的八进制数值表示权限。每个数字是权限值的累加值:

  • 读权限(r) = 4
  • 写权限(w) = 2
  • 执行权限(x) = 1

权限值与八进制数字映射:

权限组合 八进制表示 权限值计算 解释
rwx 7 4 + 2 + 1 读、写、执行
rw- 6 4 + 2 读、写
r-x 5 4 + 1 读、执行
r-- 4 4
wx- 3 2 + 1 写、执行
w-- 2 2
x-- 1 1 执行
--- 0 0 无权限

八进制权限表示示例:

  • rwxr-xr-- 对应的八进制值是 755
    • 用户权限(rwx):7(读、写、执行)
    • 组权限(r-x):5(读、执行)
    • 其他权限(r–):4(只读)

命令示例

1
chmod 755 filename

这会将文件 filename 的权限设置为 rwxr-xr--


3. 最小权限

  • 文件最小权限r--4。文件至少需要读权限才能读取文件内容,否则无法使用文件。
  • 目录最小权限r-x5。目录至少需要执行权限(x)才能进入目录,即使你有读权限,也不能列出目录中的文件。

总结

  • 文件最小权限r--(只读)
  • 目录最小权限r-x(可读并可进入)

3、复制文件移动文件命令的用法,课堂课件

1. cp 命令:复制文件

cp 命令用于复制文件或目录。

基本语法:

1
cp [选项] 来源文件 目标文件
  • 来源文件:要复制的文件或目录。
  • 目标文件:复制的目标位置,可以是一个新的文件名或目录。

常见选项:

  • -r--recursive:递归地复制整个目录(用于复制目录)。
  • -i--interactive:在覆盖文件时提示确认。
  • -u--update:仅复制源文件比目标文件新或者目标文件不存在的文件。
  • -v--verbose:显示复制过程。

示例:

  1. 复制文件

    1
    cp file1.txt /home/user/backup/

    file1.txt 复制到 /home/user/backup/ 目录中。

  2. 复制目录

    1
    cp -r /home/user/docs /home/user/backup/

    将整个 docs 目录复制到 /home/user/backup/ 目录中。

  3. 复制文件并重命名

    1
    cp file1.txt newfile.txt

    file1.txt 复制并重命名为 newfile.txt

  4. 交互式复制(如果目标文件已存在,要求确认是否覆盖):

    1
    cp -i file1.txt /home/user/backup/

2. mv 命令:移动文件

mv 命令用于移动文件或目录,或者重命名文件。

基本语法:

1
mv [选项] 来源文件 目标文件
  • 来源文件:要移动或重命名的文件。
  • 目标文件:目标位置,可以是新的文件名或目录。

常见选项:

  • -i--interactive:在覆盖文件时提示确认。
  • -u--update:仅当源文件比目标文件新或者目标文件不存在时才移动。
  • -v--verbose:显示移动过程。

示例:

  1. 移动文件

    1
    mv file1.txt /home/user/backup/

    file1.txt 移动到 /home/user/backup/ 目录中。

  2. 移动并重命名文件

    1
    mv file1.txt newfile.txt

    file1.txt 重命名为 newfile.txt

  3. 移动目录

    1
    mv /home/user/docs /home/user/backup/

    docs 目录及其所有内容移动到 /home/user/backup/ 目录中。

  4. 交互式移动(如果目标文件已存在,要求确认是否覆盖):

    1
    mv -i file1.txt /home/user/backup/

3. 区别与总结

  • cp 命令:用于复制文件或目录。复制会产生源文件的副本,原文件不会被删除。
  • mv 命令:用于移动文件或目录,也可以用于重命名文件。如果是移动操作,源文件会从原位置删除并出现在目标位置;如果是重命名文件,原文件会被删除并以新名称保留。

4、修改文件权限命令的用法,课堂课件

在 Linux 中,修改文件权限的命令是 chmod。通过 chmod 命令,可以改变文件或目录的读、写、执行权限。


chmod 命令:修改文件权限

chmod(change mode)命令用于改变文件或目录的权限。

基本语法:

1
chmod [选项] 权限 文件/目录
  • 权限:可以是字符型(符号)或八进制型的权限设置。
  • 文件/目录:要修改权限的文件或目录。

1. 使用字符型(符号)表示法

在字符型表示法中,权限是通过字母来表示的。主要分为以下几部分:

  • 用户(User):文件的拥有者,使用 u 表示。
  • 组(Group):文件所属的用户组,使用 g 表示。
  • 其他(Others):文件的其他所有人,使用 o 表示。
  • 所有人(All):所有用户,使用 a 表示。

权限:

  • r:读权限(read)
  • w:写权限(write)
  • x:执行权限(execute)

操作符:

  • **+**:添加权限
  • **-**:去除权限
  • **=**:设置权限

示例:

  1. 给用户(Owner)添加执行权限

    1
    chmod u+x file1.txt

    file1.txt 的用户权限中添加执行权限。

  2. 给组(Group)去除写权限

    1
    chmod g-w file1.txt

    file1.txt 的组权限中去除写权限。

  3. 给其他用户(Others)设置只读权限

    1
    chmod o=r file1.txt

    file1.txt 的其他用户权限设置为只读。

  4. 给所有用户(All)添加执行权限

    1
    chmod a+x file1.txt

    file1.txt 的所有用户权限中添加执行权限。

  5. 给用户(Owner)和组(Group)添加读写权限

    1
    chmod ug+rw file1.txt

    file1.txt 的用户和组权限中都添加读写权限。

  6. 给所有用户去除所有权限

    1
    chmod a-rwx file1.txt

    file1.txt 的所有用户权限去除所有权限。


2. 使用八进制表示法

在八进制表示法中,每种权限用一个数字表示。具体映射如下:

  • 读(r) = 4
  • 写(w) = 2
  • 执行(x) = 1
  • 无权限(-) = 0

权限值是通过将读、写、执行权限的数字值加起来得到的。例如:

  • 7 = rwx(读 + 写 + 执行)
  • 6 = rw-(读 + 写)
  • 5 = r-x(读 + 执行)
  • 4 = r--(读)
  • 3 = wx-(写 + 执行)
  • 2 = w--(写)
  • 1 = x--(执行)

每个权限级别(用户、组、其他)使用一个数字表示,共有三位数字:[用户][组][其他]

示例:

  1. **设置文件权限为 rwxr-xr-x**:

    1
    chmod 755 file1.txt

    解释:

    • 用户(Owner):rwx = 7
    • 组(Group):r-x = 5
    • 其他(Others):r-x = 5
  2. **设置文件权限为 rw-r--r--**:

    1
    chmod 644 file1.txt

    解释:

    • 用户(Owner):rw- = 6
    • 组(Group):r-- = 4
    • 其他(Others):r-- = 4
  3. **设置文件权限为 rwx------**:

    1
    chmod 700 file1.txt

    解释:

    • 用户(Owner):rwx = 7
    • 组(Group):--- = 0
    • 其他(Others):--- = 0
  4. **设置文件权限为 r--r--r--**:

    1
    chmod 444 file1.txt

    解释:

    • 用户(Owner):r-- = 4
    • 组(Group):r-- = 4
    • 其他(Others):r-- = 4

3. 常见选项

  • **-R--recursive**:递归地修改目录及其下所有文件的权限。

    • 示例:
      1
      chmod -R 755 /home/user/docs
      /home/user/docs 目录及其所有子目录和文件的权限设置为 rwxr-xr-x
  • **-v--verbose**:显示权限修改的详细信息。

    • 示例:
      1
      chmod -v 644 file1.txt
      显示修改权限的详细过程。

总结

  • chmod 命令用来修改文件或目录的权限。
  • 字符型表示法:使用字母(r, w, x)和操作符(+, -, =)来指定权限。
  • 八进制表示法:使用数字(0-7)来表示权限。
  • -R 选项可以递归地修改目录和文件的权限。

5、列出目录中所有文件命令的用法,课堂课件

在 Linux 中,列出目录中所有文件的命令是 lsls 命令是最常用的命令之一,用于列出指定目录中的文件和子目录。你可以通过不同的选项来控制显示的内容、格式和排序方式。


ls 命令:列出目录中的所有文件

基本语法:

1
ls [选项] [目录]
  • 选项:用于控制命令输出的格式、排序、权限等。
  • 目录:指定你要列出文件的目录。如果省略该参数,则默认列出当前工作目录。

1. 常见选项

**-a--all**:列出所有文件(包括隐藏文件)

  • 默认情况下,ls 不显示以 . 开头的文件(隐藏文件)。使用 -a 选项可以显示这些隐藏文件。
1
ls -a

输出包括所有文件,包括隐藏文件(如 .bashrc.gitignore)。

**-l**:以长格式(详细信息)显示文件

  • 显示文件的详细信息,包括权限、所有者、文件大小和最后修改时间。
1
ls -l

输出包括每个文件的详细信息,如:

1
-rw-r--r-- 1 user group  12345 Oct  3 12:34 file1.txt

**-h**:以人类可读的方式显示文件大小(与 -l 一起使用)

  • -h 使文件大小以更易读的格式显示,例如 1K2M3G 等,而不是以字节为单位。
1
ls -lh

输出示例:

1
-rw-r--r-- 1 user group 1.2K Oct  3 12:34 file1.txt

**-R**:递归列出目录及其子目录

  • 显示指定目录中的所有文件,包括所有子目录中的文件。
1
ls -R /path/to/directory

**-d**:仅显示目录本身,而不是目录中的文件

  • 如果你希望列出目录本身而不是目录中的内容,可以使用 -d 选项。
1
ls -d /path/to/directory

**-S**:按文件大小排序

  • 将列出的文件按大小排序,默认按从大到小排列。
1
ls -S

**-t**:按修改时间排序

  • 将文件按最后修改时间排序,默认按最新的文件排在最前面。
1
ls -t

**-r**:反向排序

  • 反向排序文件列表,通常与 -t-S 一起使用。
1
ls -tr

**-1**:每行列出一个文件

  • 将每个文件按行列出,通常在脚本中使用。
1
ls -1

2. 综合示例

  1. 列出当前目录的所有文件和子目录,包括隐藏文件

    1
    ls -a
  2. 列出当前目录中所有文件和目录,并显示详细信息

    1
    ls -l
  3. 列出当前目录中所有文件和目录,按大小排序(从大到小)

    1
    ls -S
  4. 列出指定目录 /home/user/ 中的所有文件,递归显示所有子目录内容

    1
    ls -R /home/user/
  5. 列出当前目录的所有文件,并以人类可读的格式显示文件大小

    1
    ls -lh
  6. 列出当前目录的所有文件,并按最后修改时间排序

    1
    ls -lt
  7. 仅列出当前目录中的目录,而不显示其中的文件

    1
    ls -d */

3. 示例:组合选项

你可以组合多个选项来实现更具体的输出。例如:

  • 列出当前目录的所有文件,包括隐藏文件,并按时间排序

    1
    ls -alt
  • 列出当前目录中所有文件,详细显示文件信息,并按文件大小从大到小排序

    1
    ls -lS
  • 递归列出 /home/user 目录及其子目录中的所有文件,并显示详细信息

    1
    ls -lR /home/user/

总结

  • ls 命令是列出文件和目录的基本命令,默认情况下只列出当前目录中的文件。
  • 常见选项包括:-a(显示隐藏文件)、-l(长格式显示)、-h(人类可读大小)、-R(递归)、-S(按大小排序)、-t(按时间排序)等。
  • 你可以根据需求组合不同选项来获得不同的输出格式和排序方式。

6、打包同时压缩文件命令tar的用法,课后习题

在 Linux 中,tar 命令是用于打包文件和目录的工具,常与压缩选项一起使用来创建压缩文件。tar 既可以用来打包文件,也可以用来解包和压缩文件。


tar 命令:打包和压缩文件

基本语法:

1
tar [选项] [压缩选项] 打包文件.tar [文件/目录]
  • 选项:定义打包或解包的操作。
  • 压缩选项:通常与压缩工具(如 gzipbzip2xz)一起使用来压缩打包文件。
  • 打包文件.tar:打包后保存的文件名。
  • 文件/目录:要打包的文件或目录。

1. 常见选项

**-c**:创建一个新归档(打包)

  • -c 用于创建一个新的归档文件。

**-x**:提取归档文件(解包)

  • -x 用于从归档文件中提取内容。

**-v**:显示详细过程(verbose)

  • -v 显示文件处理的详细信息,列出每个文件的名称。

**-f**:指定归档文件名

  • -f 紧跟归档文件名,用于指定打包后文件的名称。

**-z**:通过 gzip 压缩(常用于 .tar.gz.tgz 格式)

  • -z 表示使用 gzip 压缩文件,创建 .tar.gz.tgz 文件。

**-j**:通过 bzip2 压缩(常用于 .tar.bz2 格式)

  • -j 表示使用 bzip2 压缩文件,创建 .tar.bz2 文件。

**-J**:通过 xz 压缩(常用于 .tar.xz 格式)

  • -J 表示使用 xz 压缩文件,创建 .tar.xz 文件。

**-C**:切换到指定目录后再进行打包或解包

  • -C 用于改变目录,适用于在指定目录下打包或解包文件。

2. 打包文件

打包文件(不压缩)

1
tar -cvf archive.tar file1.txt file2.txt
  • **-c**:创建一个新归档文件。
  • **-v**:显示详细信息。
  • **-f**:指定归档文件名 archive.tar

这个命令将 file1.txtfile2.txt 打包成一个名为 archive.tar 的归档文件。

打包目录

1
tar -cvf archive.tar /path/to/directory

这个命令将目录 /path/to/directory 中的所有文件和子目录打包到 archive.tar 中。

打包并压缩为 .tar.gz(使用 gzip 压缩)

1
tar -czvf archive.tar.gz /path/to/directory
  • **-z**:使用 gzip 压缩。

这个命令将 /path/to/directory 目录打包并压缩成 .tar.gz 格式的文件。

打包并压缩为 .tar.bz2(使用 bzip2 压缩)

1
tar -cjvf archive.tar.bz2 /path/to/directory
  • **-j**:使用 bzip2 压缩。

这个命令将 /path/to/directory 目录打包并压缩成 .tar.bz2 格式的文件。

打包并压缩为 .tar.xz(使用 xz 压缩)

1
tar -cJvf archive.tar.xz /path/to/directory
  • **-J**:使用 xz 压缩。

这个命令将 /path/to/directory 目录打包并压缩成 .tar.xz 格式的文件。


3. 解包文件

解包 .tar 文件

1
tar -xvf archive.tar
  • **-x**:从归档中提取文件。
  • **-v**:显示详细信息。
  • **-f**:指定归档文件名。

这个命令将提取 archive.tar 中的所有文件。

解包 .tar.gz 文件

1
tar -xzvf archive.tar.gz
  • **-z**:使用 gzip 解压。

这个命令将提取 archive.tar.gz 中的所有文件。

解包 .tar.bz2 文件

1
tar -xjvf archive.tar.bz2
  • **-j**:使用 bzip2 解压。

这个命令将提取 archive.tar.bz2 中的所有文件。

解包 .tar.xz 文件

1
tar -xJvf archive.tar.xz
  • **-J**:使用 xz 解压。

这个命令将提取 archive.tar.xz 中的所有文件。

解包到指定目录

1
tar -xvf archive.tar -C /path/to/directory
  • **-C**:将文件解包到指定目录 /path/to/directory

这个命令将 archive.tar 中的文件解包到 /path/to/directory 目录。


4. 查看归档内容

查看 .tar 文件内容

1
tar -tvf archive.tar
  • **-t**:列出归档文件中的内容,而不提取。

这个命令列出 archive.tar 中包含的所有文件。

查看 .tar.gz 文件内容

1
tar -tzvf archive.tar.gz
  • **-z**:使用 gzip 解压,并列出文件内容。

这个命令列出 archive.tar.gz 中包含的所有文件。


5. 常见组合操作

  1. 打包并压缩为 .tar.gz 格式

    1
    tar -czvf archive.tar.gz /path/to/directory
  2. 解包并提取到指定目录

    1
    tar -xzvf archive.tar.gz -C /path/to/destination
  3. 列出 .tar 文件的内容

    1
    tar -tvf archive.tar
  4. 解压 .tar.bz2 文件并查看文件列表

    1
    tar -tjvf archive.tar.bz2

总结

  • tar 命令是 Linux 中常用的打包和压缩工具,常用于备份、传输和归档文件。
  • 选项:
    • -c:创建新的归档。
    • -x:从归档中提取文件。
    • -v:显示详细信息。
    • -f:指定归档文件名。
    • -z-j-J:使用不同的压缩算法(gzipbzip2xz)。
  • 常见的操作有打包、压缩、解包和列出文件内容。

7、磁盘分区的过程及磁盘分区命令的用法

在 Linux 系统中,磁盘分区是指将一个物理磁盘分成多个逻辑块(分区),以便系统能够有效管理磁盘空间。分区后,可以对每个分区进行文件系统的格式化、挂载等操作。常见的磁盘分区工具包括 fdisk(用于 MBR 分区表)、parted(用于 GPT 分区表)和 gparted(图形化界面工具)。在这里,我们将介绍磁盘分区的过程以及如何使用常见的磁盘分区命令。


1. 磁盘分区的过程

磁盘分区的过程一般包括以下几个步骤:

1.1 查看当前磁盘和分区信息

在进行分区之前,首先需要查看当前系统上所有磁盘及其分区信息。可以使用 lsblkfdiskparted 命令查看。

1
lsblk

或者:

1
fdisk -l

1.2 使用分区工具进行磁盘分区

  1. 选择磁盘:确定需要分区的磁盘,例如 /dev/sda
  2. 创建分区:根据需求,选择创建主分区、扩展分区或逻辑分区。
  3. 分配空间:为每个分区分配合适的空间大小。
  4. 设置分区类型:例如,Linux 文件系统(83)、交换分区(82)等。
  5. 保存并退出:完成分区后保存更改并退出分区工具。

1.3 格式化分区

每个分区创建完成后,需要对其进行格式化。常用的文件系统类型有 ext4xfsbtrfs 等。

1
mkfs.ext4 /dev/sda1

1.4 挂载分区

格式化后的分区需要挂载到指定目录,通常会挂载到 /mnt/home 等目录。

1
mount /dev/sda1 /mnt

1.5 更新 /etc/fstab 文件

为了使分区在系统启动时自动挂载,需要在 /etc/fstab 文件中添加分区信息。

1
echo "/dev/sda1 /mnt ext4 defaults 0 0" >> /etc/fstab

2. 常见的磁盘分区命令

2.1 fdisk 命令

fdisk 是一个传统的命令行工具,用于管理 MBR 分区表。它适用于较老的磁盘分区格式(最大支持 2TB 的磁盘大小)。

使用 fdisk 分区的基本步骤:

  1. 列出磁盘信息

    1
    fdisk -l
  2. 选择磁盘

    1
    fdisk /dev/sda

    进入 fdisk 的交互式界面,选择要操作的磁盘。

  3. 查看当前分区
    fdisk 命令行界面中,输入 p 来查看磁盘的分区表。

  4. 创建新分区
    输入 n 来创建新分区。接着选择分区类型(primaryextended),分配分区的起始和结束位置。

  5. 删除分区
    输入 d 删除现有分区。接着输入分区编号。

  6. 改变分区类型
    输入 t 来更改分区的类型。例如,将分区类型设置为交换分区 82

  7. 保存并退出
    输入 w 保存更改并退出 fdisk

示例:使用 fdisk 创建一个新分区

  1. 打开磁盘:

    1
    fdisk /dev/sda
  2. 查看现有分区:
    输入 p 查看现有分区信息。

  3. 创建新分区:
    输入 n 创建新分区,选择分区类型和大小。

  4. 保存并退出:
    输入 w 保存更改并退出。


2.2 parted 命令

parted 是一个功能更强大的分区工具,支持 MBR 和 GPT 分区表,适用于较大的磁盘。它支持动态分区大小调整、分区删除等功能。

使用 parted 创建分区:

  1. 启动 parted 工具

    1
    parted /dev/sda
  2. 查看磁盘信息
    parted 命令行中输入 print 查看磁盘分区信息。

  3. 创建 GPT 分区表(如果磁盘是新的):

    1
    mklabel gpt
  4. 创建新分区
    输入 mkpart 创建新分区。例如,创建一个 ext4 文件系统类型的分区:

    1
    mkpart primary ext4 0% 100%
  5. 查看分区
    输入 print 查看当前分区。

  6. 退出 parted
    输入 quit 退出 parted 工具。

示例:使用 parted 创建 GPT 分区

1
2
3
4
parted /dev/sda
mklabel gpt
mkpart primary ext4 0% 100%
quit

2.3 mkfs 命令

mkfs 用于格式化分区。根据需要的文件系统类型,可以选择不同的命令。例如,格式化为 ext4 文件系统:

1
mkfs.ext4 /dev/sda1

对于其他文件系统,命令如下:

  • mkfs.xfs /dev/sda1:格式化为 XFS 文件系统。
  • mkfs.btrfs /dev/sda1:格式化为 Btrfs 文件系统。

2.4 lsblk 命令

lsblk 用于列出所有块设备及其挂载点。通过它可以查看磁盘分区的挂载情况。

1
lsblk

输出示例:

1
2
3
4
NAME   MAJ:MIN  RM  SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
├─sda1 8:1 0 5G 0 part /mnt
├─sda2 8:2 0 5G 0 part [SWAP]

3. 小结

磁盘分区的过程通常包括以下步骤:

  1. 使用 fdiskparted 工具对磁盘进行分区。
  2. 使用 mkfs 格式化分区。
  3. 挂载分区,并更新 /etc/fstab 以实现开机自动挂载。

常用的命令和工具:

  • fdisk:用于 MBR 分区表的管理。
  • parted:用于 MBR 和 GPT 分区表的管理,支持更大的磁盘。
  • mkfs:用于格式化分区。
  • lsblk:查看磁盘和分区的状态。

8、用户管理相关配置文件的内容,用户类型有哪些?每个字段的含义?课堂课件

在 Linux 系统中,用户管理是一个重要的部分。系统通过一些配置文件来管理用户的创建、删除、登录、权限等。了解这些配置文件和用户类型对于系统管理至关重要。

1. 用户管理相关配置文件

1.1 /etc/passwd 文件

/etc/passwd 文件是 Linux 系统中最核心的用户信息文件,包含了系统中所有用户的基本信息。每个用户的信息都占一行。

文件格式

1
用户名:密码:用户ID:组ID:用户名或注释:主目录:登录Shell

字段含义

  • 用户名(Username):用户的登录名。
  • 密码(Password):通常是用户密码的加密值,但现代 Linux 系统中这一字段通常是一个占位符 x,实际密码存储在 /etc/shadow 文件中。
  • 用户ID(UID):用户的唯一标识符。系统用户通常从 0 到 999,普通用户通常从 1000 开始。
  • 组ID(GID):该用户的主要组的唯一标识符。每个用户至少有一个主组。
  • 用户名或注释(User Info):通常是用户的全名或描述信息。可以为空或包含用户的具体描述。
  • 主目录(Home Directory):用户的家目录路径。通常为 /home/用户名
  • 登录Shell(Login Shell):用户登录后启动的 Shell(例如 /bin/bash)。如果没有指定,系统会为其分配默认 Shell。

示例

1
johndoe:x:1001:1001:John Doe:/home/johndoe:/bin/bash
  • johndoe 是用户名
  • x 表示密码在 /etc/shadow 文件中
  • 1001 是 UID
  • 1001 是 GID
  • John Doe 是用户的注释(用户名)
  • /home/johndoe 是用户的家目录
  • /bin/bash 是登录时使用的 Shell

1.2 /etc/shadow 文件

/etc/shadow 文件用于存储用户的加密密码及与密码相关的配置。该文件比 /etc/passwd 更加安全,因为只有管理员(root)可以访问该文件。

文件格式

1
用户名:加密密码:最后修改密码的日期:最小间隔:最大间隔:警告天数:禁用天数:过期日期:保留字段

字段含义

  • 用户名(Username):与 /etc/passwd 中的用户名对应。
  • 加密密码(Encrypted Password):用户的密码的加密字符串。若该字段为空,表示该用户没有设置密码;若是 *!,表示用户被禁用。
  • 最后修改密码的日期(Last Password Change):用户密码最后一次修改的日期,单位为天数(从 1970-01-01 开始的天数)。
  • 最小间隔(Minimum Days):用户修改密码前的最短天数。如果值为 0,表示没有最小间隔。
  • 最大间隔(Maximum Days):用户密码的最大有效期,超过该时间后,用户需要修改密码。
  • 警告天数(Warning Days):在密码过期前多少天开始提醒用户修改密码。
  • 禁用天数(Inactive Days):密码过期后,用户账户的禁用天数。超出该天数后,用户账户会被锁定。
  • 过期日期(Expire Date):账户过期的日期,单位为天数(从 1970-01-01 开始的天数)。如果为空,则表示账户永不过期。
  • 保留字段(Reserved Field):保留字段,通常为空。

示例

1
johndoe:$6$Z6tXSoLg$Lb7JHgD29k5fqRkdjVsj.l8AlUz62KwFVwl7AZI6bx58AtC.8I6yL8AOn..l9F5zdU7Lg9pWVtTisWqZY5Nsz.:17501:0:99999:7:::
  • johndoe 是用户名
  • $6$Z6tXSoLg$Lb7JHgD29k5fqRkdjVsj.l8AlUz62KwFVwl7AZI6bx58AtC.8I6yL8AOn..l9F5zdU7Lg9pWVtTisWqZY5Nsz. 是加密的密码
  • 17501 是最后修改密码的日期
  • 0 是最小间隔(允许立即修改密码)
  • 99999 是最大间隔(密码过期之前 99999 天)
  • 7 是警告天数(密码过期前 7 天开始警告)

1.3 /etc/group 文件

/etc/group 文件保存了用户组的信息。每个组包含一行记录,表示一个组的相关信息。

文件格式

1
组名:密码:组ID:用户列表

字段含义

  • 组名(Group Name):组的名称。
  • 密码(Password):通常为空。与 /etc/shadow 中的密码字段类似,这个字段在现代系统中大多为空。
  • 组ID(GID):组的唯一标识符。
  • 用户列表(User List):属于该组的用户的列表,多个用户之间用逗号隔开。

示例

1
staff:x:1001:johndoe,alice,bob
  • staff 是组名
  • x 表示密码(通常为空)
  • 1001 是组ID(GID)
  • johndoe,alice,bob 是属于该组的用户列表

1.4 /etc/login.defs 文件

/etc/login.defs 是一个配置文件,控制系统的用户账号管理的默认行为,包括密码复杂性、用户ID范围等。

字段含义

  • PASS_MAX_DAYS:密码最大使用天数。
  • PASS_MIN_DAYS:密码最小使用天数。
  • PASS_MIN_LEN:密码最小长度。
  • PASS_WARN_AGE:密码过期前的警告天数。
  • UID_MIN:系统用户的最小 UID。
  • UID_MAX:普通用户的最大 UID。
  • GID_MIN:系统组的最小 GID。
  • GID_MAX:普通组的最大 GID。

示例

1
2
3
4
5
6
7
8
PASS_MAX_DAYS   99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 8
PASS_WARN_AGE 7
UID_MIN 1000
UID_MAX 60000
GID_MIN 1000
GID_MAX 60000

2. 用户类型

在 Linux 中,用户主要分为以下几类:

2.1 普通用户(Normal User)

普通用户是系统中普通的非管理员用户,通常在 /etc/passwd 文件中,UID 从 1000 或 500 开始。普通用户只能访问自己拥有的文件,并且不能执行管理任务。

2.2 系统用户(System User)

系统用户通常用于运行系统服务、守护进程等,它们的 UID 通常小于 1000。系统用户的主要目的是为了保证系统服务的运行,并且通常不需要登录。

2.3 管理员用户(Root User)

管理员用户是 UID 为 0 的用户,也叫 root 用户。它拥有系统的所有权限,可以进行系统级的管理任务,如安装软件、修改系统配置等。root 用户在 /etc/passwd 中的 UID 为 0。


3. 总结

  1. /etc/passwd 文件保存了用户的基本信息,如用户名、密码、UID、GID、主目录和登录 Shell 等。
  2. /etc/shadow 文件存储了用户的加密密码和与密码相关的配置,如密码过期时间、最小和最大修改间隔等。
  3. /etc/group 文件保存了用户组的相关信息,每个组包含一个 GID 和属于该组的用户列表。
  4. /etc/login.defs 文件控制了与用户账号相关的默认行为,如密码策略、UID 范围等。

用户类型主要包括普通用户、系统用户和管理员用户(root 用户)。

9、添加用户命令的用法,实验六 3(1)

在 Linux 系统中,添加用户的常用命令是 useradd,它允许系统管理员创建新用户。创建用户时,系统会自动为该用户创建一个主目录,并为其分配 UID、GID 等相关信息。

1. useradd 命令

useradd 命令用于创建一个新用户,并将该用户的信息添加到 /etc/passwd/etc/shadow/etc/group 文件中。

基本语法:

1
useradd [选项] 用户名

2. 常见选项

  • **-d**:指定用户的主目录(Home Directory)。
    • 示例:-d /home/johndoe
  • **-m**:自动创建用户的主目录。如果没有指定主目录,并且未使用此选项,useradd 不会创建用户的主目录。
    • 示例:-m
  • **-s**:指定用户的默认登录 Shell。
    • 示例:-s /bin/bash
  • **-g**:指定用户的主组(Group)。如果没有指定,系统会为用户创建一个同名的主组。
    • 示例:-g staff
  • **-G**:指定用户所属的附加组(Additional Groups)。可以指定多个附加组,用逗号分隔。
    • 示例:-G wheel,developers
  • **-p**:指定用户的密码(密码需要加密)。在实际操作中,这个选项很少使用,因为通常在 /etc/shadow 文件中修改密码。
    • 示例:-p 密码
  • **-u**:指定用户的 UID(User ID)。如果不指定,系统会自动分配一个未使用的 UID。
    • 示例:-u 1234
  • **-c**:添加用户的描述信息(注释),通常是用户的全名。
    • 示例:-c "John Doe"
  • **-e**:设置用户帐户的到期日期。
    • 示例:-e 2024-12-31

3. 添加用户的常见用法

3.1 创建一个新用户并自动创建主目录

1
useradd -m johndoe
  • 该命令将创建一个名为 johndoe 的用户,并为其创建 /home/johndoe 主目录。

3.2 创建用户并指定主目录和 Shell

1
useradd -m -d /home/johndoe -s /bin/bash johndoe
  • 该命令将创建一个名为 johndoe 的用户,主目录为 /home/johndoe,默认登录 Shell 为 /bin/bash

3.3 创建用户并指定附加组

1
useradd -m -G wheel,developers johndoe
  • 该命令将创建一个名为 johndoe 的用户,并将其添加到 wheeldevelopers 两个附加组。

3.4 创建用户并设置描述信息

1
useradd -m -c "John Doe, Developer" johndoe
  • 该命令将创建一个名为 johndoe 的用户,并设置描述信息为 John Doe, Developer

3.5 创建用户并指定 UID 和 GID

1
useradd -m -u 1234 -g staff johndoe
  • 该命令将创建一个 UID 为 1234,主组为 staff 的用户 johndoe

4. 设置用户密码

创建用户后,可以通过 passwd 命令为用户设置密码:

1
passwd johndoe

该命令将提示输入 johndoe 用户的密码,并进行密码确认。成功设置密码后,用户即可使用密码登录。

5. 检查用户信息

使用 id 命令可以检查某个用户的 UID、GID 以及所属的所有组:

1
id johndoe

输出示例:

1
uid=1234(johndoe) gid=1001(staff) groups=1001(staff),1002(wheel),1003(developers)

6. 删除用户

删除用户使用 userdel 命令。例如,删除用户 johndoe

1
userdel johndoe

如果要删除用户的主目录和邮件目录,可以加上 -r 选项:

1
userdel -r johndoe

7. 修改用户信息

如果需要修改某个用户的信息,可以使用 usermod 命令。

  • 修改用户主目录

    1
    usermod -d /new/home/dir -m johndoe

    -m 表示移动原主目录中的文件到新的主目录。

  • 修改用户的登录 Shell

    1
    usermod -s /bin/zsh johndoe
  • 修改用户的附加组

    1
    usermod -G newgroup johndoe

8. 小结

  • useradd 命令用于创建新用户。常用选项包括:-m(创建主目录)、-d(指定主目录)、-s(指定登录 Shell)、-G(指定附加组)、-u(指定 UID)等。
  • passwd 命令用于为新用户设置密码。
  • id 命令可以查看用户的 UID、GID 和所属的组。
  • userdel 用于删除用户,可以使用 -r 删除用户的主目录。
  • usermod 用于修改用户的属性,如主目录、Shell 或附加组。

10、复习输入输出重定向,预习课件

在 Linux 中,输入输出重定向是非常重要的功能,它允许用户将程序的输入输出流定向到文件或其他命令,而不是默认的标准输入(键盘)和标准输出(屏幕)。通过输入输出重定向,用户可以实现更灵活的命令操作和数据处理。

1. 标准输入、输出和错误

  • 标准输入(stdin):通常是键盘,表示为文件描述符 0
  • 标准输出(stdout):通常是屏幕,表示为文件描述符 1
  • 标准错误(stderr):用于输出错误信息,表示为文件描述符 2

通过重定向,可以控制这些流的去向,进行更灵活的操作。


2. 输出重定向(>>>

2.1 使用 > 进行输出重定向

> 将命令的标准输出(stdout)重定向到一个文件。如果目标文件不存在,系统会创建该文件。如果文件已存在,系统会覆盖原文件内容。

示例

1
echo "Hello, World!" > output.txt
  • 该命令将字符串 "Hello, World!" 输出到 output.txt 文件中。如果 output.txt 文件已存在,内容将被覆盖。

2.2 使用 >> 进行追加输出

>> 会将标准输出追加到指定的文件末尾,而不是覆盖文件内容。如果文件不存在,系统会自动创建文件。

示例

1
echo "Append this text." >> output.txt
  • 该命令将 "Append this text." 追加到 output.txt 文件的末尾。如果文件不存在,则会创建该文件。

2.3 重定向命令的错误输出到文件

可以使用 2> 将标准错误(stderr)输出到文件。

示例

1
ls non_existent_file 2> error.txt
  • 该命令尝试列出一个不存在的文件,并将错误信息重定向到 error.txt 文件中。

2.4 将标准输出和标准错误输出都重定向到同一个文件

可以使用 &> 或者 2>&1 将标准输出和标准错误输出都重定向到同一个文件。

示例 1:使用 &> 重定向标准输出和标准错误到同一文件

1
command &> output.txt
  • 该命令将标准输出和标准错误都重定向到 output.txt

示例 2:使用 2>&1 将标准错误与标准输出合并并重定向

1
command > output.txt 2>&1
  • 该命令先将标准输出重定向到 output.txt,然后将标准错误重定向到标准输出的位置。

3. 输入重定向(<

输入重定向允许将一个文件的内容作为标准输入提供给命令。使用 < 符号可以将文件的内容传递给命令作为输入,而不是从键盘读取。

示例

1
sort < input.txt
  • 该命令将 input.txt 文件的内容作为输入提供给 sort 命令,以对文件内容进行排序。

4. 管道(|

管道将一个命令的输出作为下一个命令的输入,而不需要使用文件进行中间存储。管道符号 | 用于连接多个命令,允许多个命令组合成一个命令链。

示例

1
cat file.txt | sort | uniq
  • 该命令将 file.txt 文件的内容通过 cat 命令传递给 sort 命令进行排序,再将排序后的内容传递给 uniq 命令以去除重复行。

5. 文件描述符和重定向

Linux 中每个打开的文件都与一个文件描述符(file descriptor)关联。文件描述符是一个整数,用于标识文件或输入输出流。标准输入、标准输出和标准错误都有相应的文件描述符:

  • 标准输入(stdin):文件描述符 0
  • 标准输出(stdout):文件描述符 1
  • 标准错误(stderr):文件描述符 2

通过重定向,可以使用这些文件描述符来控制输入和输出。

5.1 关闭文件描述符

可以通过重定向 > 到文件描述符的特殊值 &- 来关闭文件描述符。例如:

示例:关闭标准输出(stdout)

1
command > /dev/null 2>&1
  • 该命令将标准输出和标准错误都重定向到 /dev/null,实际上就是丢弃所有输出。

5.2 将一个文件描述符重定向到另一个文件描述符

通过 2>&1 这样的语法,标准错误可以重定向到标准输出流,从而使它们指向同一个目标。

示例

1
command 2>&1 1>/dev/null
  • 该命令将标准错误重定向到标准输出,然后将标准输出重定向到 /dev/null,最终丢弃所有输出,仅显示标准错误。

6. 重定向的常见用法

6.1 将命令输出保存到文件

1
echo "This is a test" > testfile.txt
  • 输出 "This is a test"testfile.txt 文件。

6.2 将多个命令的输出合并到同一个文件

1
2
echo "First line" > output.txt
echo "Second line" >> output.txt
  • "First line" 输出到 output.txt,然后将 "Second line" 追加到该文件中。

6.3 将命令输出作为输入传递给另一个命令

1
cat file.txt | grep "search_term"
  • file.txt 文件的内容传递给 grep 命令,搜索指定的文本 "search_term"

6.4 使用文件重定向作为命令的输入

1
sort < unsorted.txt
  • unsorted.txt 文件的内容作为输入提供给 sort 命令,进行排序。

7. 小结

  • 输出重定向:使用 > 将输出重定向到文件,>> 将输出追加到文件,2> 重定向标准错误输出。
  • 输入重定向:使用 < 将文件内容作为输入提供给命令。
  • 管道:使用 | 将一个命令的输出传递给另一个命令作为输入。
  • 文件描述符:标准输入、标准输出和标准错误分别对应文件描述符 012,可以通过这些文件描述符进行灵活的重定向操作。

输入输出重定向在 Linux 系统中是处理数据和文件的强大工具,可以帮助你更高效地管理和操作命令的输入输出流。

11、GCC编译器用法,课堂课件

GCC(GNU Compiler Collection)是一个广泛使用的编译器,支持多种编程语言的编译,特别是 C 和 C++。GCC 的命令行选项非常灵活,可以处理不同类型的源代码文件,进行预处理、编译、汇编和链接等步骤。

1. GCC 编译器的基本用法

GCC 是一个多功能的编译器,可以处理 C、C++、Fortran、Ada 等多种语言的源代码。

基本语法

1
gcc [选项] 源文件 [选项] [库文件]

GCC 通过多个阶段来将源代码编译为可执行文件:

  1. 预处理(Preprocessing):处理宏定义、文件包含等操作。
  2. 编译(Compilation):将源代码转为汇编代码。
  3. 汇编(Assembly):将汇编代码转为机器代码。
  4. 链接(Linking):将对象文件链接成可执行文件。

2. 常用命令和选项

2.1 基本编译

编译一个简单的 C 文件为可执行文件:

1
gcc hello.c -o hello
  • hello.c 是源代码文件。
  • -o hello 指定输出文件名为 hello,即可执行文件名。
  • 如果不指定 -o,默认输出文件名为 a.out

2.2 生成汇编代码

将 C 文件编译成汇编文件(.s 文件):

1
gcc -S hello.c
  • -S 选项告诉 GCC 只执行编译过程(即生成汇编代码),不进行后续的汇编和链接。

2.3 生成目标文件

将 C 文件编译成目标文件(.o 文件),但不进行链接:

1
gcc -c hello.c
  • -c 选项告诉 GCC 只进行编译,不进行链接,生成 .o 文件(目标文件)。

2.4 编译并链接生成可执行文件

将多个目标文件链接成可执行文件:

1
gcc hello.o world.o -o hello
  • hello.oworld.o 是目标文件。
  • -o hello 指定输出文件名为 hello

2.5 使用预处理器选项

你可以查看预处理阶段的输出,例如展开宏和头文件:

1
gcc -E hello.c
  • -E 选项告诉 GCC 只运行预处理器,输出预处理后的源代码。

2.6 输出详细的编译过程

为了查看 GCC 编译的详细信息,你可以使用 -v 选项:

1
gcc -v hello.c
  • -v 显示编译的详细过程,包括预处理、编译、汇编和链接的所有步骤。

2.7 指定编译标准(例如 C99)

如果想要指定特定的 C 标准,可以使用 -std 选项。例如,使用 C99 标准:

1
gcc -std=c99 hello.c -o hello
  • -std=c99 指定使用 C99 标准进行编译。

3. 调试选项

GCC 提供了一些选项用于调试程序,最常用的是 -g,它会生成包含调试信息的可执行文件。

3.1 添加调试信息

1
gcc -g hello.c -o hello
  • -g 选项使 GCC 在生成的可执行文件中包含调试信息,以便使用调试工具(如 gdb)进行调试。

3.2 优化代码

GCC 提供了多种优化选项,可以根据需要优化生成的代码。例如:

  • -O0:不进行任何优化(默认)。
  • -O1:进行基本优化。
  • -O2:进行更高的优化,常用的优化选项。
  • -O3:进行最高级别的优化,可能会增加编译时间和代码体积。
  • -Os:优化代码大小,减小可执行文件的大小。
1
gcc -O2 hello.c -o hello
  • -O2 进行中等程度的优化。

3.3 生成汇编代码并优化

如果想查看优化后的汇编代码,可以结合 -S-O2 使用:

1
gcc -O2 -S hello.c
  • -S 会生成汇编代码,-O2 会对代码进行优化。

4. 使用库和头文件

GCC 允许你链接静态库和共享库,以及包含自定义的头文件。

4.1 指定头文件路径

如果需要使用非标准路径下的头文件,可以使用 -I 选项指定路径:

1
gcc -I /path/to/headers hello.c -o hello
  • -I 后跟头文件所在目录的路径。

4.2 链接静态库

静态库通常是 .a 文件。使用 -L 指定库文件路径,使用 -l 指定要链接的库。

1
gcc hello.c -L /path/to/libs -l mylib -o hello
  • -L /path/to/libs 指定库的搜索路径。
  • -l mylib 指定要链接的库,mylib.alibmylib.a 会被自动找到并链接。

4.3 链接共享库(动态库)

共享库通常是 .so 文件。可以使用 -L-l 选项链接共享库。

1
gcc hello.c -L /path/to/libs -l mylib -o hello
  • -L 指定共享库的搜索路径。
  • -l 用来指定要链接的库名称(如 libmylib.so)。

5. 常见的 GCC 编译选项

选项 说明
-o 指定输出文件的名称
-c 仅编译源文件,生成 .o 目标文件
-S 仅进行编译,生成汇编文件
-g 生成调试信息
-O 设置优化级别(-O0-O1-O2-O3-Os
-Wall 启用大部分警告信息
-std=xxx 指定语言标准,如 c99, c11, c++11
-I 指定头文件搜索路径
-L 指定库文件搜索路径
-l 链接库文件(如 -lm
-v 显示详细的编译过程
-E 仅运行预处理器,输出预处理后的源代码

6. 生成可执行文件的常见流程

6.1 编译源代码为目标文件(.o

1
gcc -c hello.c

6.2 链接目标文件生成可执行文件

1
gcc hello.o -o hello

6.3 或者一步到位的编译和链接

1
gcc hello.c -o hello

7. 小结

  • GCC 是一个功能强大的编译器,支持多种编程语言。
  • 使用 gcc 命令可以方便地进行源代码的编译、链接和调试。
  • 常用选项包括 -c(编译),-S(生成汇编代码),-O(优化),-g(调试信息),-I(指定头文件路径),-L(指定库路径)等。
  • GCC 还支持将多个源文件编译为目标文件,再进行链接生成可执行文件。

GCC 是 Linux 下最常用的编译器,掌握它的用法对编写高效、可维护的程序至关重要。

12、查看进程、结束进程命令的用法,如何过滤某个想要查找的进程?课堂课件

在 Linux 中,查看和管理进程是日常系统管理的重要部分。pstopkill 等命令常用于查看和控制进程的状态。下面详细介绍如何使用这些命令查看进程、结束进程以及如何过滤特定的进程。

1. 查看进程

1.1 ps 命令

ps(process status)命令用于列出当前系统中的进程。它有许多选项,可以显示不同层次的进程信息。

常用选项

  • **ps**:列出当前终端(会话)中运行的进程。

    1
    ps
  • ps -e 或 **ps -A**:列出所有进程(不局限于当前终端)。

    1
    ps -e
  • **ps -u <用户名>**:列出某个用户的所有进程。

    1
    ps -u root
  • **ps aux**:列出所有进程(包括其他用户的进程),并显示详细的进程信息(如 CPU、内存使用情况、启动时间等)。

    1
    ps aux
  • **ps -ef**:显示所有进程的完整格式,类似 ps aux,包括父进程(PID)和进程树。

    1
    ps -ef
  • **ps aux | less**:当进程很多时,可以使用 less 分页查看。

    1
    ps aux | less

1.2 top 命令

top 是一个动态实时显示进程资源使用情况的命令。它显示了系统中最消耗资源的进程,并且会实时更新。

1
top
  • 默认显示按 CPU 使用率排序的进程列表。
  • top 中,你可以按 **P**(按 CPU 排序)或 **M**(按内存排序)进行排序。
  • q 用来退出 top 命令。

1.3 htop 命令

htop 是一个比 top 更加友好的实时进程查看工具,提供了彩色界面、进程树结构和更多的交互选项。需要事先安装:

1
sudo apt install htop

然后运行:

1
htop
  • 你可以在 htop 中直接使用上下键选择进程,按 F9 进行进程操作(如杀死进程)。

1.4 pgrep 命令

pgrep 命令根据进程名称过滤出进程的 PID(进程 ID),非常方便查找特定的进程。

1
pgrep <进程名>

例如,查找 nginx 进程的 PID:

1
pgrep nginx
  • 你也可以使用 -u 选项指定用户名来查找该用户的进程:
    1
    pgrep -u username

2. 过滤和查找特定进程

2.1 使用 psgrep 过滤进程

可以使用 psgrep 命令结合,查找某个特定进程。例如,查找 nginx 进程:

1
ps aux | grep nginx
  • ps aux 显示所有进程。
  • grep nginx 用于过滤出包含 nginx 的进程行。

注意grep nginx 本身也会显示,因为它在命令行中也是一个进程。如果不想显示 grep 自己的进程,可以使用:

1
ps aux | grep '[n]ginx'
  • 这会避免 grep 命令自身被列出,因为方括号中的字符不会被视为正则表达式的一部分。

2.2 使用 pgrep 查找进程

pgrep 可以根据进程名或其他条件过滤进程,返回匹配的进程 PID。它比 ps aux | grep 更加高效。

查找 nginx 进程的 PID:

1
pgrep nginx

2.3 使用 tophtop 过滤进程

top 中,你可以按 Shift + L(或 o)然后输入你要过滤的进程名称进行过滤。

htop 中,按 F3 输入进程名称来过滤进程。


3. 结束进程

3.1 使用 kill 命令

kill 命令用于发送信号到进程,默认发送的是 **SIGTERM**(终止信号)。你可以通过发送不同的信号来控制进程。

基本用法

1
kill <PID>

例如,终止 PID 为 1234 的进程:

1
kill 1234

如果进程没有响应,可以发送 **SIGKILL**(信号编号 9),强制终止进程:

1
kill -9 1234

3.2 使用 killall 命令

killall 可以根据进程名终止所有匹配的进程。例如,终止所有名为 nginx 的进程:

1
killall nginx
  • killall 会终止所有名为 nginx 的进程,类似于 kill 命令,但不需要指定进程 ID(PID)。

3.3 使用 pkill 命令

pkill 命令与 killall 类似,但它支持使用正则表达式匹配进程名。可以更灵活地选择要终止的进程。

例如,使用 pkill 终止所有包含 “nginx” 的进程:

1
pkill nginx
  • 默认情况下,pkill 会发送 SIGTERM 信号。如果需要发送强制终止信号,可以使用 -9
    1
    pkill -9 nginx

4. 管理进程的其他有用命令

4.1 pstree 命令

pstree 显示进程的树状结构,展示父进程和子进程之间的关系。非常适合查看进程之间的层次关系。

1
pstree
  • 默认按进程树结构展示进程关系,可以使用 -p 选项显示进程的 PID:
    1
    pstree -p

4.2 nicerenice 命令

  • **nice**:启动一个新的进程,并为其设置优先级(”nice” 值)。优先级范围是 -20 到 19,数值越小,优先级越高。

    启动一个进程并设置其 nice 值:

    1
    nice -n 10 command
  • **renice**:改变一个正在运行的进程的优先级。

    更改 PID 为 1234 的进程优先级:

    1
    renice -n 10 -p 1234

小结

  • 查看进程:使用 pstophtoppgrep 等命令来查看进程。
  • 过滤进程:可以使用 ps aux | greppgrep 等方法过滤进程。
  • 结束进程:使用 killkillallpkill 来结束指定进程,可以选择不同的信号(如 -9 强制终止)。
  • 管理进程:使用 nicerenice 来调整进程的优先级。

13、统计目录占用磁盘空间大小命令的用法,课堂课件

在 Linux 中,查看和统计目录或文件占用的磁盘空间是常见的系统管理任务。可以使用一些命令来帮助分析磁盘空间的使用情况,特别是查找哪些目录或文件占用了较多的空间。

1. du 命令

du(disk usage)命令用于查看目录或文件占用的磁盘空间大小。它可以递归地显示每个子目录的磁盘使用情况,并统计总的磁盘空间。

1.1 du 的基本用法

1
du [选项] [目录]
  • du 默认会显示当前目录下每个子目录的磁盘使用情况。

示例

1
du
  • 显示当前目录及其子目录的磁盘使用情况。

1.2 显示目录总占用空间

如果只想显示一个目录的总大小,可以使用 -s(summary)选项。这样 du 将显示目录总共占用的磁盘空间,而不会显示子目录的详细信息。

示例

1
du -s /path/to/directory
  • 显示 /path/to/directory 目录的总磁盘使用情况。

1.3 显示以可读的单位(例如 KB, MB, GB)显示空间

为了让输出更容易理解,可以使用 -h(human-readable)选项,以人类可读的方式显示文件大小。

示例

1
du -sh /path/to/directory
  • -s 显示目录的总大小,-h 使得输出以易于理解的格式(KB、MB、GB)显示。

1.4 查看每个子目录的磁盘使用情况

可以通过 -h 选项查看每个子目录的磁盘占用,并以人类可读的方式显示。

示例

1
du -h /path/to/directory
  • 显示 /path/to/directory 及其所有子目录的磁盘使用情况。

1.5 排序显示最大的目录和文件

如果你想查看哪个目录占用的磁盘空间最多,可以使用 du 命令结合 sort 命令来排序输出。

示例

1
du -h /path/to/directory | sort -rh
  • sort -rh 会按人类可读的数字排序,-r 表示逆序,-h 表示排序时考虑 KB、MB、GB 等单位。

1.6 显示指定深度的子目录

如果目录结构很深,可以使用 --max-depth 选项限制显示的目录深度。

示例

1
du -h --max-depth=1 /path/to/directory
  • --max-depth=1 表示仅显示 /path/to/directory 目录及其直接子目录的大小。递归的显示子目录可以使用更大的数字(如 --max-depth=2)。

1.7 显示文件和目录的详细信息

如果你想查看目录下每个文件的大小而不仅仅是目录大小,可以使用 -a(all)选项。

示例

1
du -ah /path/to/directory
  • 显示 /path/to/directory 下所有文件和目录的大小。

2. df 命令

df(disk free)命令用于查看文件系统的磁盘空间使用情况,它会显示磁盘上各个分区的空间使用情况。

2.1 df 的基本用法

1
df [选项]
  • df 默认以块为单位显示每个文件系统的总空间、已用空间和可用空间。

示例

1
df
  • 显示所有已挂载文件系统的磁盘使用情况。

2.2 显示人类可读的空间

df 默认以块为单位显示空间,通常每个块是 1K 大小。使用 -h 选项,df 会以人类可读的格式(如 KB、MB、GB)显示磁盘空间。

示例

1
df -h
  • 以易于理解的格式显示磁盘空间。

2.3 显示特定目录的磁盘使用情况

如果只想查看某个特定目录所在分区的磁盘使用情况,可以指定该目录。

示例

1
df -h /path/to/directory
  • 显示 /path/to/directory 所在文件系统的磁盘使用情况。

2.4 显示文件系统的 inode 使用情况

通过 -i 选项,可以查看文件系统中 inode 的使用情况。每个文件和目录都需要一个 inode,如果 inode 耗尽,将无法创建新文件,即使磁盘空间仍然可用。

示例

1
df -i
  • 显示每个文件系统的 inode 使用情况。

3. ncdu 命令(可选,增强版)

ncdu(NCurses Disk Usage)是一个基于命令行的磁盘使用分析工具,提供了一个交互式的界面,可以快速地查看磁盘空间的使用情况。

3.1 安装 ncdu

在某些 Linux 发行版中,ncdu 可能没有默认安装,可以通过包管理器安装。

Debian/Ubuntu

1
sudo apt install ncdu

CentOS/RHEL

1
sudo yum install ncdu

3.2 使用 ncdu

执行 ncdu 命令并指定目录,它会扫描该目录的磁盘使用情况并提供交互式界面。

示例

1
ncdu /path/to/directory
  • ncdu 会显示目录下每个文件和子目录的大小,并允许你通过上下箭头浏览。

4. 总结

  • du 命令:最常用的工具,用于显示目录或文件的磁盘使用情况。常用选项有:

    • -s:仅显示目录的总大小。
    • -h:以人类可读的格式显示大小(KB, MB, GB)。
    • --max-depth:限制递归深度。
    • -a:显示文件和目录的详细信息。
  • df 命令:用于查看文件系统的磁盘空间使用情况。常用选项有:

    • -h:以人类可读的格式显示磁盘空间。
    • -i:显示 inode 使用情况。
  • ncdu 命令:交互式的磁盘使用分析工具,提供更直观的磁盘空间使用查看方式。

这些命令可以帮助你快速分析和管理磁盘空间,识别磁盘使用的热点,并清理不必要的文件和目录。

14、find命令的-exec动作和用管道连接两个命令的区别,课堂课件

find 命令是 Linux 中用于查找文件和目录的强大工具,它有很多选项和动作,能够在查找到符合条件的文件后执行特定操作。-execfind 命令的一种动作,它允许你在查找到匹配文件后执行其他命令。与通过管道连接命令(如 |)的方式相比,-exec 和管道的作用和行为有所不同。

1. find 命令的 -exec 动作

-exec 动作允许你在查找到符合条件的文件后执行任意命令。常用场景包括删除文件、移动文件、修改文件权限等。

1.1 -exec 用法

基本语法

1
find [路径] [条件] -exec [命令] {} \;
  • find:查找文件的命令。
  • [路径]:指定搜索的路径。
  • [条件]:指定文件匹配的条件(如 -name-type 等)。
  • -exec:用于执行命令。
  • [命令]:在找到文件后执行的命令。
  • {}:代表当前找到的文件。find 会将找到的每个文件名替换 {}
  • \;:表示命令的结束,必须加上反斜杠 \,防止与其他字符混淆。

示例 1:查找并删除 .log 文件

1
find /path/to/directory -name "*.log" -exec rm {} \;
  • 这个命令查找 /path/to/directory 目录及其子目录中所有以 .log 结尾的文件,并使用 rm 命令删除这些文件。
  • {} 会被替换成查找到的每个文件名。

1.2 使用 + 来替代 \;

使用 -exec 时,默认每找到一个文件就执行一次命令。如果希望对所有匹配的文件一起执行命令,可以使用 + 替代 \;,这时 find 会将多个文件作为参数传递给命令,减少命令执行次数。

示例 2:批量删除 .log 文件

1
find /path/to/directory -name "*.log" -exec rm {} +
  • 这样做会将所有符合条件的文件一起传递给 rm 命令,减少命令执行的次数,效率更高。

2. 用管道连接两个命令

管道(|)用于将一个命令的标准输出作为另一个命令的标准输入。这与 -exec 动作的不同之处在于,管道不直接作用于 find 的每一个结果,而是通过将一个命令的输出传递给下一个命令来处理。

2.1 管道用法

基本语法

1
command1 | command2
  • command1:第一个命令,输出将作为管道的输入。
  • command2:第二个命令,接受管道传递的输入。

示例 1:列出 .log 文件并通过 grep 过滤

1
find /path/to/directory -name "*.log" | grep "error"
  • 这个命令会查找 /path/to/directory 目录下所有以 .log 结尾的文件,并将其结果通过管道传递给 grep 命令,进一步过滤出文件名中包含 error 的文件。

2.2 管道与 -exec 的区别

  • 管道:将一个命令的输出作为另一个命令的输入处理。
  • **-exec**:在查找到的每个文件上执行命令,可以直接对文件进行操作(如删除、修改权限等)。

2.3 区别与优缺点

特性 -exec 方式 管道方式
执行方式 -exec 会对每个查找结果执行命令(默认每个文件一条命令)。 管道通过连接命令,将一个命令的输出传递给另一个命令。
参数传递 -exec 将每个匹配的文件逐个传递给指定命令。 管道将命令的输出作为下一个命令的输入。
效率 使用 -exec 时,默认每个文件调用一次命令,效率较低,除非使用 + 来批量传递。 如果仅仅是传递结果,管道的方式可以更加高效。
操作对象 -exec 可以直接对每个文件进行操作(如删除、修改权限等)。 管道主要用于处理命令输出,不直接操作文件。
适用场景 -exec 适用于在查找文件后需要对其执行某种操作的场景。 管道适用于将一个命令的输出作为另一个命令的输入进行处理的场景。

3. 总结

  • find 命令的 -exec 动作和管道(|)都有各自的用途。
    • -exec 用于在找到符合条件的文件后执行特定命令(如删除、修改权限等),支持逐个文件处理,也可以通过 + 批量处理文件。
    • 管道 用于将一个命令的输出作为另一个命令的输入进行处理,适用于过滤、处理结果等场景,但不直接对文件本身进行操作。

选择使用 -exec 还是管道,取决于你需要对文件执行操作的性质。-exec 是直接操作文件的工具,而管道是用于将命令的输出流处理和传递的工具。

15、PATH环境变量的作用,课堂课件

PATH 环境变量是 Linux 和其他类 Unix 操作系统中最重要的环境变量之一,它指定了操作系统在执行命令时搜索可执行文件的目录列表。PATH 环境变量的作用是告诉 shell(例如 bash)在哪些目录中查找可执行文件,当你在命令行中输入一个命令时,shell 会根据 PATH 变量指定的路径顺序去查找对应的可执行文件。

1. PATH 环境变量的作用

  • 命令查找路径PATH 告诉 shell 在哪些目录下查找用户输入的命令。当你输入一个命令时,shell 会依次在 PATH 中列出的各个目录中查找是否存在该命令的可执行文件。

  • 简化命令执行:如果没有设置 PATH,你每次执行命令时就需要输入命令的完整路径。例如,要执行 ls,你就必须输入 /bin/ls,而不是仅输入 ls。通过设置 PATH,你只需要输入命令的名称即可,系统会自动从 PATH 中指定的路径查找该命令。

2. PATH 环境变量的结构

PATH 环境变量是一个由多个目录路径组成的字符串,每个目录路径之间用冒号(:)分隔。在 Linux 系统中,常见的 PATH 路径有 /bin/usr/bin/sbin/usr/sbin 等。

示例

1
echo $PATH

输出示例

1
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

这表示当你输入命令时,shell 会依次在以下目录中查找:

  • /usr/local/sbin
  • /usr/local/bin
  • /usr/sbin
  • /usr/bin
  • /sbin
  • /bin
  • /snap/bin

3. 修改 PATH 环境变量

你可以通过修改 PATH 环境变量来添加、删除或改变搜索命令的顺序。

3.1 临时修改 PATH

临时修改 PATH 只会在当前 shell 会话中生效,关闭终端后设置会丢失。

示例

1
export PATH=$PATH:/new/directory/path
  • 这将会把 /new/directory/path 目录添加到 PATH 变量的末尾。
  • export 命令将修改后的 PATH 环境变量应用到当前的 shell 会话中。

3.2 永久修改 PATH

要使 PATH 修改永久生效,需要将其添加到用户的配置文件中(例如 ~/.bashrc~/.bash_profile~/.zshrc 等,具体文件根据所用 shell 和操作系统而异)。

示例

  1. 打开 ~/.bashrc 文件:

    1
    nano ~/.bashrc
  2. 在文件的末尾添加:

    1
    export PATH=$PATH:/new/directory/path
  3. 保存并关闭文件后,运行以下命令使修改生效:

    1
    source ~/.bashrc

3.3 删除某个目录从 PATH

如果要从 PATH 中删除某个目录,可以使用 sed 命令或直接编辑配置文件。

示例

1
export PATH=$(echo $PATH | sed -e 's|:/path/to/remove||')
  • 这将从 PATH 中删除 /path/to/remove 目录。

4. PATH 中常见的目录

在 Linux 系统中,PATH 中常见的目录包括:

  • **/bin**:包含基本的系统命令,如 lscpmvrm 等。
  • **/usr/bin**:包含用户级别的命令和应用程序,例如文本编辑器(如 vimnano)和其他用户工具。
  • **/sbin**:包含系统管理命令,如 ifconfigreboot 等,通常只有 root 用户可执行。
  • **/usr/sbin**:包含一些系统管理命令和服务,例如 apache2systemctl 等。
  • **/usr/local/bin**:包含本地安装的程序和脚本,通常由用户安装的自定义软件会安装到这个目录。
  • **/usr/local/sbin**:与 /usr/local/bin 类似,但专门用于存放系统管理命令。

5. 查找可执行文件的位置

可以使用 whichtype 命令来查找命令所在的路径。

示例

1
which ls
  • 显示 ls 命令的完整路径,如 /bin/ls
1
type ls
  • 显示 ls 命令的类型和路径。

6. PATH 的作用总结

  • 命令查找PATH 告诉 shell 在哪些目录中查找可执行文件。
  • 简化命令执行:通过设置 PATH,你可以仅输入命令的名称,省去输入完整路径的麻烦。
  • 命令优先级PATH 中的目录顺序决定了查找命令的优先级,先找到的命令会被执行。
  • 可自定义:可以通过修改 PATH 来添加、删除或修改命令搜索路径,从而定制自己的命令查找策略。

7. PATH 相关命令

  • **echo $PATH**:查看当前的 PATH 环境变量。
  • **which <command>**:查看命令的完整路径。
  • **type <command>**:显示命令的类型和路径。

8. 常见问题

  • 命令找不到(command not found):通常是因为命令所在目录没有包含在 PATH 中,或者目录路径配置错误。
  • 权限问题PATH 中的某些目录可能只有管理员(root)用户有权限访问,普通用户无法执行目录中的命令。

通过合理配置 PATH,你可以更方便地在系统中执行命令,并确保命令按照你期望的方式被执行。

16、定时计划任务:如何制定定时任务的语法,要会写具体的例子,比如某天几点做

什么事情?理解计划任务的执行原理,也就是与在终端中执行命令时执行原理的区别。计
划任务执行过程中有哪些记录,输出结果在哪里?课堂课件

在 Linux 系统中,定时任务通常通过 cron 服务来管理。cron 是一个基于时间的任务调度程序,它允许用户在指定的时间自动执行任务。定时任务的配置语法是通过 crontab 文件来管理的。

1. crontab 定时任务的语法

crontab 文件用于定义定时任务的时间和命令执行的规则。定时任务的时间表达式由 5 个字段组成,分别表示分钟、小时、日、月和星期几。

基本语法

1
* * * * * command_to_execute

每个字段的含义如下:

  • 分钟(0 - 59):在每小时的哪一分钟执行命令。
  • 小时(0 - 23):在每天的哪个小时执行命令。
  • 日期(1 - 31):在每月的哪一天执行命令。
  • 月份(1 - 12):在哪些月份执行命令。
  • 星期几(0 - 7):在星期几执行命令。07 代表星期天,1 代表星期一,以此类推。

示例

1
30 8 10 5 * /path/to/command
  • 30:在 30 分钟时执行
  • 8:在 8 点执行
  • 10:在每个月的 10 号执行
  • 5:在 5 月执行
  • *****:任何星期几执行

这意味着该任务会在每年 5 月的 10 号 8:30 AM 执行指定的命令。

2. crontab 文件的格式

  • 每一行表示一个定时任务。
  • 每行的 5 个时间字段后面是要执行的命令。
  • 注释行以 # 开头,允许你添加注释来解释任务。

3. 常见的 crontab 时间表达式

  • *****:表示任意值。
  • ***/n**:表示每 n 个单位执行一次。
  • **a,b,c**:表示多个值(逗号分隔)。
  • **a-b**:表示一个范围,从 ab

举例

  1. 每分钟执行一次任务
    1
    * * * * * /path/to/command
  2. 每天凌晨 3 点执行任务
    1
    0 3 * * * /path/to/command
  3. 每月 1 号凌晨 12 点执行任务
    1
    0 0 1 * * /path/to/command
  4. 每周一凌晨 4 点执行任务
    1
    0 4 * * 1 /path/to/command
  5. 每小时执行一次任务
    1
    0 * * * * /path/to/command
  6. 每 15 分钟执行一次任务
    1
    */15 * * * * /path/to/command

4. 管理定时任务

4.1 编辑定时任务

使用 crontab 命令来编辑当前用户的 crontab 文件。

1
crontab -e
  • 这会打开当前用户的 crontab 文件,你可以在其中添加、修改或删除定时任务。

4.2 查看当前用户的定时任务

1
crontab -l
  • 列出当前用户所有的定时任务。

4.3 删除所有定时任务

1
crontab -r
  • 删除当前用户的所有定时任务。

4.4 查看系统级 cron 任务

系统级别的定时任务通常存储在 /etc/crontab/etc/cron.d/ 目录下,你可以通过编辑这些文件来设置定时任务。系统任务需要具有管理员权限。

5. 计划任务的执行原理

cron 是一个守护进程,持续在后台运行,它会定期检查 crontab 文件和系统中指定的定时任务。当系统时间满足定时任务的条件时,cron 会启动对应的命令。

与在终端中直接执行命令的不同,cron 在执行计划任务时有以下几个区别:

  • 环境不同cron 执行的任务没有你在交互式 shell 中的所有环境变量(如 PATHHOME 等)。这意味着,如果在命令中使用相对路径,cron 可能找不到对应的命令。所以建议在定时任务中使用完整路径。
  • 没有终端交互cron 任务的执行不会依赖终端,因此无法与用户交互。输出和错误信息会被重定向。
  • 任务日志cron 任务的执行过程不会在终端显示信息,但它们的输出(包括错误信息)会被记录到指定的文件中。

6. 计划任务执行中的记录

cron 执行计划任务时,任务的输出通常会被重定向到文件。如果没有明确指定输出文件,默认情况下:

  • 标准输出stdout)和标准错误stderr)都会被发送到用户的邮件中(默认是发送到系统中指定的邮件地址,通常是本地用户的邮箱)。

  • 如果你希望输出被重定向到文件,可以在 crontab 中指定。例如:

    1
    0 2 * * * /path/to/command >> /path/to/logfile 2>&1

    这个任务会在每天凌晨 2 点执行,并将标准输出和标准错误一起重定向到 /path/to/logfile 文件。

6.1 查看邮件日志

如果你希望检查某个任务的输出,你可以通过邮件(如 mail 命令)查看 cron 发送的输出邮件。

1
mail

6.2 查看系统日志

系统的 cron 活动会被记录在系统日志文件中,通常是 /var/log/cron/var/log/syslog(取决于你的系统配置)。你可以查看这些日志文件来了解计划任务是否成功执行。

查看日志文件

1
cat /var/log/cron

或者

1
cat /var/log/syslog | grep cron

7. 总结

  • crontab 文件:定义定时任务的时间和命令执行规则。
  • 语法* * * * * command,5 个时间字段分别代表分钟、小时、日期、月份和星期几。
  • 定时任务的执行原理cron 是一个后台服务,定期检查任务并在指定时间执行命令。与终端中直接执行命令的区别在于,cron 执行任务时没有用户交互和完整的环境变量。
  • 输出记录:定时任务的输出默认通过邮件发送,也可以通过重定向将输出保存到文件中。

通过 cron,你可以实现自动化任务的定时执行,如备份、系统检查、日志清理等。

17、shell编程:IF条件判断中会做文件判断;会写for循环语句;会写脚本;会分析脚

本;课堂课件和课后习题

在 Shell 编程中,条件判断和循环语句是最常见的控制结构,用于执行不同的操作。下面是你提到的主要内容的详细说明,包括 if 条件判断文件判断、**for 循环**,以及如何编写和分析脚本。

1. if 条件判断

if 语句用于根据条件来决定是否执行某一段代码。Shell 中的条件语句可以进行文件检查、变量检查和字符串比较等。

1.1 基本的 if 语法:

1
2
3
if [ condition ]; then
# commands to execute if condition is true
fi
  • condition 是要测试的条件表达式。
  • [ ] 是测试条件的符号。
  • then 后面跟要执行的命令。
  • fi 用来结束 if 语句。

1.2 常用的 if 判断条件

  • 文件测试
    • -e filename:文件存在。
    • -f filename:文件是普通文件。
    • -d filename:文件是目录。
    • -r filename:文件可读。
    • -w filename:文件可写。
    • -x filename:文件可执行。

示例:检查文件是否存在且可读:

1
2
3
4
5
if [ -e /path/to/file ] && [ -r /path/to/file ]; then
echo "File exists and is readable."
else
echo "File does not exist or is not readable."
fi
  • 数字比较
    • -eq:等于
    • -ne:不等于
    • -lt:小于
    • -le:小于等于
    • -gt:大于
    • -ge:大于等于

示例:检查两个数字的大小:

1
2
3
4
5
6
7
8
num1=5
num2=10

if [ $num1 -lt $num2 ]; then
echo "$num1 is less than $num2"
else
echo "$num1 is not less than $num2"
fi
  • 字符串比较
    • =:字符串相等
    • !=:字符串不等
    • -z:字符串为空
    • -n:字符串不为空

示例:检查字符串是否为空:

1
2
3
4
5
6
7
str="Hello"

if [ -n "$str" ]; then
echo "String is not empty"
else
echo "String is empty"
fi

1.3 结合 elifelse 使用:

1
2
3
4
5
6
7
if [ condition1 ]; then
# commands if condition1 is true
elif [ condition2 ]; then
# commands if condition2 is true
else
# commands if neither condition1 nor condition2 is true
fi

2. 文件判断

在 Shell 脚本中,经常需要检查文件是否存在、是否可读/可写等。使用 if 语句结合文件测试操作符进行判断。

常用的文件测试操作符

  • -e:文件存在
  • -f:是普通文件
  • -d:是目录
  • -r:文件可读
  • -w:文件可写
  • -x:文件可执行
  • -s:文件非空

示例:判断文件是否存在且是普通文件:

1
2
3
4
5
if [ -f /path/to/file ]; then
echo "File exists and is a regular file."
else
echo "File does not exist or is not a regular file."
fi

示例:判断文件是否是目录:

1
2
3
4
5
if [ -d /path/to/directory ]; then
echo "It is a directory."
else
echo "It is not a directory."
fi

3. for 循环语句

for 循环用于遍历一组值并执行相应的操作。在 Shell 中,for 循环有不同的用法。

3.1 基本的 for 循环语法:

1
2
3
for var in value1 value2 value3 ...; do
# commands to execute
done

示例:打印 1 到 5 的数字:

1
2
3
for i in 1 2 3 4 5; do
echo "Number: $i"
done

3.2 for 循环结合序列使用:

你也可以使用 seq 命令生成一个数字序列。

示例:打印 1 到 5 的数字:

1
2
3
for i in $(seq 1 5); do
echo "Number: $i"
done

3.3 for 循环结合文件列表:

你还可以遍历文件或目录中的文件。

示例:遍历某个目录中的所有文件并打印它们的文件名:

1
2
3
for file in /path/to/directory/*; do
echo "File: $file"
done

4. 编写和分析 Shell 脚本

4.1 编写一个简单的 Shell 脚本

一个简单的 Shell 脚本可以包含上述的条件判断和循环。

示例:检查一个目录是否存在,如果存在则列出其中的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

# 获取用户输入的目录路径
read -p "Enter a directory path: " dir

# 判断目录是否存在
if [ -d "$dir" ]; then
echo "Directory exists. Listing files..."
for file in "$dir"/*; do
echo "$file"
done
else
echo "Directory does not exist."
fi
  • #!/bin/bash 是脚本的 shebang,指示使用的解释器。
  • read 用于获取用户输入。
  • if 语句用于判断目录是否存在。
  • for 循环遍历该目录下的所有文件并输出。

4.2 脚本的执行

将脚本保存为文件(例如 myscript.sh),并赋予执行权限:

1
chmod +x myscript.sh

然后运行:

1
./myscript.sh

5. 分析 Shell 脚本

分析一个 Shell 脚本时,主要需要关注以下几个方面:

  1. 变量:了解脚本中使用的变量及其作用。
  2. 条件判断:分析 ifcase 等条件判断语句,弄清楚不同条件下会执行的命令。
  3. 循环:查看 forwhile 循环的作用,确保循环的条件设置正确。
  4. 输入输出:检查脚本是否有输入(read)或输出(echo)操作。
  5. 文件操作:如果脚本涉及到文件操作,确保文件路径正确,且文件存在或有适当的权限。

5.1 分析脚本实例:

假设我们有以下脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

# 获取文件名
echo "Enter the filename:"
read filename

# 判断文件是否存在
if [ -f "$filename" ]; then
echo "File exists. Displaying contents:"
cat "$filename"
else
echo "File does not exist."
fi
  • 该脚本首先提示用户输入一个文件名。
  • 然后通过 if 判断该文件是否存在并且是普通文件。
  • 如果文件存在,使用 cat 命令显示文件内容;否则,输出文件不存在的信息。

5.2 脚本输出:

运行该脚本时,用户输入文件名后:

  • 如果文件存在,脚本显示文件内容。
  • 如果文件不存在,脚本输出 “File does not exist.”

6. 课堂课件和课后习题

你可以根据课堂的课件或习题来编写和分析 Shell 脚本。通常课后习题会包括如下内容:

  • 编写带有条件判断的脚本。
  • 使用 for 循环遍历目录或列表。
  • 完成实际问题的自动化脚本编写。

18、C编程:文件系统调用会写程序,课堂课件

在 C 编程中,文件系统调用(File System Calls)是与文件操作相关的系统调用,用于在程序中进行文件的创建、读取、写入、删除等操作。C 语言通过标准库提供了对文件的访问方式,但在操作系统层面,文件操作通过系统调用实现。常见的文件系统调用包括:open()read()write()close()unlink() 等。

1. 文件操作的系统调用

1.1 open()

open() 用于打开一个文件,返回文件描述符,后续对文件的操作会使用这个文件描述符。

语法

1
int open(const char *pathname, int flags, mode_t mode);
  • pathname:文件路径。
  • flags:打开文件时的标志,如 O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(读写)、O_CREAT(如果文件不存在则创建)。
  • mode:文件权限,只有在创建新文件时使用。

返回值

  • 如果成功,返回文件描述符(一个整数)。
  • 如果失败,返回 -1,并设置 errno

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {
int fd = open("example.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
if (fd == -1) {
perror("Error opening file");
return 1;
}
// 文件打开成功
printf("File opened successfully\n");
close(fd);
return 0;
}

这个示例打开(或创建)一个名为 example.txt 的文件,并为当前用户设置读写权限。

1.2 read()

read() 用于从文件中读取数据。

语法

1
ssize_t read(int fd, void *buf, size_t count);
  • fd:文件描述符。
  • buf:指向缓冲区的指针,用于存储从文件中读取的数据。
  • count:要读取的字节数。

返回值

  • 成功时,返回读取的字节数。
  • 失败时,返回 -1,并设置 errno

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {
int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return 1;
}

char buffer[128];
ssize_t bytesRead = read(fd, buffer, sizeof(buffer) - 1);
if (bytesRead == -1) {
perror("Error reading file");
return 1;
}

buffer[bytesRead] = '\0'; // 添加字符串结束符
printf("Read from file: %s\n", buffer);

close(fd);
return 0;
}

该程序从 example.txt 文件读取数据,并将其打印出来。

1.3 write()

write() 用于向文件写入数据。

语法

1
ssize_t write(int fd, const void *buf, size_t count);
  • fd:文件描述符。
  • buf:指向要写入的数据的缓冲区。
  • count:要写入的字节数。

返回值

  • 成功时,返回写入的字节数。
  • 失败时,返回 -1,并设置 errno

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {
int fd = open("example.txt", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
if (fd == -1) {
perror("Error opening file");
return 1;
}

const char *text = "Hello, world!";
ssize_t bytesWritten = write(fd, text, 13);
if (bytesWritten == -1) {
perror("Error writing to file");
return 1;
}

printf("Successfully wrote to file\n");
close(fd);
return 0;
}

该程序向 example.txt 文件写入数据。如果文件已存在,会将其清空(O_TRUNC)。

1.4 close()

close() 用于关闭文件描述符,释放资源。

语法

1
int close(int fd);
  • fd:文件描述符。

返回值

  • 成功时,返回 0
  • 失败时,返回 -1,并设置 errno

示例

1
2
3
4
int result = close(fd);
if (result == -1) {
perror("Error closing file");
}

unlink() 用于删除一个文件。

语法

1
int unlink(const char *pathname);
  • pathname:要删除的文件的路径。

返回值

  • 成功时,返回 0
  • 失败时,返回 -1,并设置 errno

示例

1
2
3
4
5
6
7
8
9
10
11
12
#include <unistd.h>
#include <stdio.h>

int main() {
int status = unlink("example.txt");
if (status == -1) {
perror("Error deleting file");
return 1;
}
printf("File deleted successfully\n");
return 0;
}

此程序删除名为 example.txt 的文件。

2. 使用标准库的文件操作

除了系统调用,C 还提供了标准库函数来进行文件操作,这些函数是通过标准输入输出库 <stdio.h> 提供的。常见的文件操作函数包括 fopen()fread()fwrite()fclose() 等。

2.1 fopen()

用于打开文件并返回文件指针。

语法

1
FILE *fopen(const char *filename, const char *mode);
  • filename:要打开的文件名。
  • mode:打开文件的模式,常见模式有:
    • "r":只读
    • "w":写入(如果文件存在则清空)
    • "a":追加写入
    • "rb""wb":二进制文件模式

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

int main() {
FILE *fp = fopen("example.txt", "w");
if (fp == NULL) {
perror("Error opening file");
return 1;
}

fprintf(fp, "Hello, world!\n");
fclose(fp);

return 0;
}

2.2 fread()fwrite()

  • **fread()**:从文件中读取数据。
  • **fwrite()**:向文件写入数据。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main() {
FILE *fp = fopen("example.txt", "w");
if (fp == NULL) {
perror("Error opening file");
return 1;
}

const char *text = "Hello, world!";
fwrite(text, sizeof(char), 13, fp);
fclose(fp);

return 0;
}

2.3 fclose()

关闭文件指针。

语法

1
int fclose(FILE *fp);

3. 课堂课件和实践

在课堂上,你通常会学习文件的打开、读写、关闭、删除等基本操作,同时还会涉及文件描述符与文件指针的区别。文件描述符是操作系统内部用于标识文件的整数,而文件指针是通过标准库管理的结构体,提供更高级的文件操作接口。

3.1 练习题

  1. 编写一个程序,读取一个文本文件的内容并打印出来。
  2. 编写一个程序,将用户输入的内容写入到指定的文件中。
  3. 编写一个程序,删除指定的文件。
  4. 编写一个程序,检查一个文件是否存在,如果存在则打印文件的内容,否则显示错误信息。

通过这些练习,你可以加深对文件操作系统调用及标准库函数的理解。

4. 总结

C 编程中的文件系统调用允许你进行底层的文件操作,如文件的打开、读取、写入、关闭等。这些操作在开发文件处理应用程序时非常重要。掌握文件的操作系统调用,能够让你高效地处理文件,同时了解文件描述符与文件指针的区别对于理解底层操作至关重要。