Linux 基础 01

实验环境:

  • Linux 5.19.13-arch1-1
  • konsole 22.08.2

目录

一. 概述

二. 文件系统

三. 包管理

四. 桌面系统

五. 硬件管理

一. 概述

1. 简述

Linux 的前身是 Unix,Unix 是没有可视化桌面的,和 Unix 系统交互就是和一个黑色的窗口交互,因为 Unix 要收费,大哥 Linus Torvalds 一怒之下开发了一个类似 Unix 系统的 Linux 系统,并将这个系统永久开源,后来经过大量网友的帮助下完善

关于开源:开源的软件使用的协议叫做开源协议,常用的有 GNU协议、BSD协议、MIT协议、Mozilla协议、Apache协议等,所有使用了开源代码的软件也默认开源并使用其上层的开源协议。

通常情况下 Linux = Linux 内核 + shell + 文件结构 + 实用工具

Linux 这个词实际上指的并不是一个计算机系统,而是 Linux 内核,其负责整个计算机硬件的驱动,包括防火墙机制、是否支持LVM或Quota等文件系统等等,当内核“认识”某个硬件,这个硬件才能被驱动(使用)。但随着发展,人们直接用 Linux 系统指代那些使用了 Linux 内核的计算机系统。

Shell 可以称之为 ‘壳’ ,Linux内核驱动着众多硬件,但我们不会直接去指挥硬件,而是在更抽象的 shell 上操作硬件,shell 是一个命令解释器,输入的 Linux 指令首先由 shell 进行解析,然后再转换为对内核的操作。

Linux 的一个宗旨是:一切皆为文件。在 Linux 中,文件的组织方法叫做 文件结构,这种组织方式和数据结构中的树类似,这部分会在第二章中详细解释

Linux内核、shell 和 文件结构组合起来就可以组成一个最基本的 Linux 系统。而为了实现特定业务的第三方软件称为实用工具,可以为用户提供更多的便利

2. Linux 发行版

Linux 是开源的,只要遵循 GPL协议,就可以自由修改内核,并在外面套上各种各样的实用软件,封装成一个系统发布给别人使用。进而形成现在所看到的各种各样的 Linux 发行版,如 Mint、Ubuntu、Debian、Mageia、Fedora、Opensuse、ArchLinux、CentOS 等

Linux 系统在众多优点中,最大的优点是免费,除 RedHat 等部分商用的系统外,其它 Linux 都可以免费获得并使用

Windows 一旦用于商用,都要支付相应的费用,但 Linux 不用,用户可以免费获得并使用 Linux 系统,甚至‘组装’一个新的 Linux 系统

各发行版的大致分类。一般是按照打包方式划分或者发行方式划分,如果按照发行方式划分则分为商业版和社区版,这里按照打包方式划分进行介绍

以下发行版信息来源于Linux系统发行版大全(历史大全含发展图)_tanglx(汤龙祥)的博客-CSDN博客_linux 版本大全,下面是简单的分类

打包方式 发行版 简单介绍(没有介绍)
Deb Debian
Deepin 还有基于Deepin的UOS
Ubuntu
... Linux Mint、Elementary OS、Xubuntu ...(套娃,基于Ubuntu)
Rpm Red Hat
CentOS
Fedora
Red Flag
openSUSE
... aLinux、Asianux Server、Qomo Linux、Red Hat Enterprise Linux、SUSE/openSUSE
其它 Gentoo 使用自己的包管理系统,口号是自由,即自由组装自己的系统,专业性++,因为是年轻的系统,号称集合了所有Linux的优点。基于源代码,安装的时候需要自己编译安装自己的系统,过程可能对新手稍显困难
Arch 和Gentoo大体相同,更新方式和Gentoo一样采用的滚动更新,但安装比Gentoo更方便,但在Linux里,Gentoo好像更为高大上个人看法
FreeBSD 其他分类的系统基本都是基于FreeBSD的系统。Calculate、Foresight、Lunar
基于slackware ...没用过,略

4. Linux 安装

网上的安装教程很多,大部分 Linux 发行版的安装差不多都一样:

  • 选择一个适合自己的 Linux

  • Houge_Langle 安装教程

  • Arch Linux 安装使用教程 - ArchTutorial - Arch Linux Studio,关于 Arch Linux 的安装,博主有视频教程,不过是在油管上,这个是文档链接,博主的博客部署在github上,所以使用国内的网络可能会比较慢

  • 日常桌面系统推荐 Arch、openSUSE、Debian、Deepin、Majaro、Mint

  • 服务器推荐安装 RedHat、CentOS、Federo

  • 注意:如果要在电脑或服务器上安装实体机,最好先找个 硬盘 或者 云硬盘 保存好数据

  • 注意:在大部分教程中,只会给根分区划分 100 G 左右的硬盘给根分区,这在虚拟机上面是足够的,但如果使用 Linux 作为日常使用的桌面系统,仅仅 100 G 给根分区是不够的,因为默认系统包管理器会将软件安装在 /usr 下,类似于 Windows 所有软件都安装在 C 盘下的恐怖。Linux 初始根分区使用的硬盘容量比较小,划分大小的关键在于估算以后安装软件的大小。以下是我当前电脑的分区方案

# 我的分区方案
gpt
/efi   1G    vfat (200M就够了,我只是喜欢整数)
/      465G  ext4
/home  589G  ext4
  • 注意:如果想安装 Win+Linux 双系统,将两个的引导分区放在同一个分区内,且在安装第二个系统的时候不要格式化这个位置。

5. Linux 终端

Linux 终端是 Linux 的重要组成部分,学会终端和命令行就学会了一半的 Linux

如果已经安装好了系统,可以打开 konsole 召唤小黑屋(伪终端)与系统进行交互,或者同时按下 Ctrl + Alt + F[2..6] 进入 终端(Teletypewriters) 与系统进行交互

Ctrl + Alt + F1:可视化图形界面,可作为日常使用的桌面的基础

Ctrl + Alt + F[2..6]:tty 是终端设备的统称,终端是一种字符型设备,一般在 Linux 系统上,tty 一般有 5 个,从 tty2 到 tty6

# 以下是在(伪)终端中输入的命令(简单体验)
# 查看:系统类型 + 主机名 + 系统版本 + 时间 + CPU架构 + 系统协议(应该是吧)
uname -a
### 显示信息
Linux DragonBoat 5.16.16-arch1-1  Mon, 21 Mar 2022 22:59:40 +0000 x86_64 GNU/Linux

# 更改主机名,ctl 后缀的命令为 RedHat 7 版本以上系统所有
hostnamectl set-hostname newName

# 查看计算机状态信息
hostnamectl status

# 查看网络状态。  
# 这里address少打几个字母问题不大,所有网络配置命令只要已打出的命令具有唯一性
# 即在ip命令中`ip add`只有一条对应的`address`,其会自动补充并执行
ip address 

二. 文件系统

1. 文件系统结构

文件系统是一颗倒着的树,从/开始。或许可以使用 tree 命令来看一下这颗树

# 如果出现 command not found 就是 tree 这个软件包还没有被安装
# ArchLinux 安装 tree
sudo pacman -S tree
# 常规Linux安装tree
sudo apt-get install tree
# 或
sudo yum -y install tree

# tree 的常规使用, 只显示两个层级,层级过多显得过于繁杂
tree / -L 2

# 看看在根下有什么
tree / -L 1
### 显示信息
/
├── bin -> usr/bin
├── boot
├── dev
├── efi
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib
├── lost+found
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/bin
├── srv
├── swapfile
├── sys
├── tmp
├── usr
└── var
  • 注意,Linux系统的文件系统大同小异,以上的列表是在本地实验机上获取的,可能会与你正在使用的系统文件结构有差异

  • Linux 中一切皆为文件,在 Linux 中能运行的只有两种文件,一是脚本文件,即 shell脚本、perl脚本、python脚本等;二是二进制程序文件,

目录 作用
/ 根目录,所有目录的起点
/bin 包含系统启动和运行所必须的二进制程序。一般内部命令的二进制程序都会存放在这里,这些命令即使在文件系统没有被挂载时仍可以使用
/sbin 这个目录包含“系统”二进制文件。它们是完成重大系统任务的程序,通常为超级用户保留,因为这里通常存放 删除、格式化工具的命令
/lib 包含核心系统程序所需的库文件。这些文件与 Windows 中的动态链接库相似,作用类似于 Windows 里的 DLL 文件;几乎所有的应用程序都需要用到这些共享库;类似的还有lib32、lib64、libx32
/usr /usr 目录可能是最大的一个目录。它包含普通用户所需要的所有程序和文件。如果说 /bin 和 /lib 是系统级的,那 /usr/bin 和 /usr/lib 就是低用户级的,用户使用包管理器安装的软件会存放在 /usr/bin 和 /usr/sbin 中
/usr/bin 用户级的程序目录,存放这些程序的 二进制文件
/usr/sbin 类似于 /sbin,这里的命令对系统有一定的“危险性”
/usr/lib 包含由/usr/bin 目录中的程序所用的共享库,通常为二进制文件
/usr/share 包含许多由/usr/bin 目录中的程序使用的共享数据。 其中包括像默认的配置文件,图标,桌面背景,音频文件等等
/usr/local /usr/local 下的层次结构是模仿 /usr 下的层次结构,用户可以在这里编译软件,由源码编译的程序会存放(安装)在 /usr/local/bin 目录下,程序所使用的库文件存放在 /usr/local/lib 中。但安装在这里的程序并不会自动更新
/usr/local/bin
/usr/local/lib
/opt 这个目录是为了按安装不属于系统的软件包(第三方软件或任何外部软件)而保留的,和 /usr/local 非常相似,可以将软件包的源代码放在这里,然后编译软件,但在这里,并没有 /opt/bin 目录和 /opt/lib 目录,所编译的软件只会创建一个属于该软件的文件夹,其二进制文件和库文件都放在这个文件夹里
目录 作用
/boot 存放 Linux 启动时的一些核心文件,包括 Linux内核(vmlinuz)、开机设置相关文件(存储在 grub 中的 字体设置、主题、系统设置等),但请不要直接修改这里的文件
/efi 这个目录一般位于 /boot 下,存放系统的默认引导程序,提供了一种在安全启动(Secure Boot)开启的状态下使用的方法
/lost+found 当部分恢复一个损坏的文件系统时,文件系统会自救,将文件备份在这个路径下。除非文件系统真正的损坏了,否则这个目录就是个空目录
/dev Linux中一切都是文件,硬件设备也是,它们会以文件的形式在这个目录下,设备的信息以二进制形式存储在文件里。/dev 下每个文件的作用可以看一下这篇文章
/etc etc,Etcetera,用来存放所有的系统层面的的配置文件。包含一系列的shell脚本,系统启动时会启动相应的系统服务。在/etc/crontab, 定义自动运行的任务。 /etc/fstab,包含存储设备的列表,以及与他们相关的挂载点。/etc/passwd,包含用户帐号列表。
/root (超级用户)系统管理员的家目录
/home 当在系统中创建一个用户的时候,默认为新用户创建一个独属于该用户的家目录,避免不同用户之间相互干扰
/mnt mount;设备的可移除挂载点,可用于临时挂载设备,但现在基本不再使用,转而使用 /run/media
/run 临时文件系统,储存系统启动以来的信息,当系统重启时,这个目录下的文件应该被删除或清除,不建议对该目录进行操作;Arch挂载硬盘时,会挂载在/run/media 下而不是 /mnt
/proc Processes; 一个虚拟的文件系统,存储当前内核运行状态的一系列文件,存储在内存里,这些文件是可读的,可以从这里窥视内核是怎么监管系统的
/swap 虚拟交换分区,真实内存不足时使用硬盘空间作为内存,部分系统或许会将它命名为 /swapfiles
/srv 系统启动时,存放服务启动之后需要提取的数据
/var 除了/tmp 和 /home 目录之外,相对来说,目前我们看到的目录是静态的,这是说, 它们的内容不会改变。/var 目录是可能需要改动的文件存储的地方。各种数据库,假脱机文件, 用户邮件等等,都在这里
/tmp temporary;用于存储由各种程序创建的临时文件的地方。一些配置,导致系统每次 重新启动时,都会清空这个目录

2. 操作目录

显示当前工作目录的路径:pwd

改变当前工作目录:cd

相对路径与绝对路径:

  • 相对路径:以当前工作目录为参照,链接到目标文件资源的路径。

  • 绝对路径:以根为参照,链接到目标文件资源的路径。

例如,以 /usr/local 为例,假设当前工作目录为 /usr ,则链接到 local 目录的绝对路径是 /usr/local,相对路径是 local

创建目录:mkdir

删除目录:rmdir

移动目录 | 修改目录名:mv

1. pwd
# 一般我们称当前在文件系统中的位置为工作目录
# 全称 ”print working directory“,⽤于显⽰当前⼯作⽬录的路径,即显⽰所在位置的绝对路径
pwd

2. cd
# ”change directory“,⽤于更改当前所处的⼯作⽬录,
# 路径可以是绝对路径,也可以是相对路径,若省略不写则会跳转⾄当前使⽤者的家⽬录
cd /usr  # 相对路径和绝对路径想必都了解了,略
cd ..    # 返回上一级目录,也可以返回上两级 cd ../..

3. mkdir
# “make directories”,⽤于创建⽬录⽂件
# 语法格式
mkdir [参数] ⽬录
###
mkdir -p /tmp/d1/d1.1/ # 递归创建多级⽬录(原 d1 ⽬录不存在)
mkdir -m 700 dir2 # 建⽴⽬录的同时设置⽬录的权限

4. rmdir
#  “remove directory”,⽤于删除空⽬录⽂件,不带参数的情况下只能删除空⽬录
# 语法格式
rmdir [参数] ⽬录
###
rmdir -p /home/d1 # ⽤递归的⽅式删除指定的⽬录路径中的所有⽗级⽬录,⾮空则报错

5. mv
# “move”,⽤于对⽂件或目录进⾏剪切和重命名
# 可以理解为 “Ctrl+x“ && ”Ctrl+v“
# 改命令可以对 文件 和 目录 起作用
# 语法格式:
mv [参数] 源⽂件 ⽬标⽂件
###
mv 源⽂件 ⽬标⽂件 # 若路径没有改变,可以理解为重命名操作v
mv -i 源⽂件 ⽬标⽂件 # 若存在同名⽂件,则向⽤⼾询问是否覆盖
mv -f 源⽂件 ⽬标⽂件 # 覆盖已有⽂件时,不进⾏任何提⽰

3. 操作文件

复制文件:cp

创建文件:touch

删除文件:rm

移动文件 | 修改文件名:mv

众所周知,Linux 中一切都是文件,目录也是一份文件

使用 cat 命令打印一个目录,里面的内容包含这个目录的一些信息(只读),可以看到该目录下的子级目录和文件(其它信息的含义暂时忽略)

cp、rm、mv 对 文件 有效果

1. cp
# copy,⽤于将⼀个或多个⽂件或⽬录复制到指定位置
# 语法格式
cp [参数] 源⽂件 ⽬标⽂件
###
cp -f # 若⽬标⽂件已存在,直接覆盖,不询问
cp -i # 若⽬标⽂件已存在,覆盖前询问
cp -p # 保留源⽂件⽬录的所有属性,包括权限和其它杂七杂⼋的属性
cp -r # 递归复制⽂件和⽬录cp -a 源文件或目录 目标文件或目录

2. touch
# 用于创建空文件与修改时间戳
# 语法格式:
touch [参数] 文件

3. rm
# remove,⽤于删除⽂件或⽬录,⼀次可以删除多个⽂件
# 这个命令很危险,总有狗头人打着清理内存,给电脑加速的借⼝说 rm -rf /* 可以让电脑
# 的速度更快,这个命令如果使用 root 权限完全运⾏,电脑系统瞬间消失
# 语法格式
rm [参数] ⽂件(file or directory)
###
rm -r filename # 递归删除
rm -f filename # 强制删除,不会进⾏⼆次询问
rm -rf /tmp/testDocu/* # '*'作为通配符,删除/tmp/testDocu下所有文件

4. mv
# “move”,⽤于对⽂件或目录进⾏剪切和重命名
# 可以理解为 “Ctrl+x“ && ”Ctrl+v“
# 改命令可以对 文件 和 目录 起作用
# 语法格式:
mv [参数] 源⽂件 ⽬标⽂件
###
mv 源⽂件 ⽬标⽂件 # 若路径没有改变,可以理解为重命名操作v
mv -i 源⽂件 ⽬标⽂件 # 若存在同名⽂件,则向⽤⼾询问是否覆盖
mv -f 源⽂件 ⽬标⽂件 # 覆盖已有⽂件时,不进⾏任何提⽰

4. 查看文件

查看当前路径下所有文件:ls

截取文件全部内容:cat、more、less(tac)

截取文件部分内容:head、tail

查看文件隐藏属性: lsattr

更改文件隐藏属性:chattr

查看文件进程信息:lsof

Linux系统中的一切都是文件,那么使用lsof命令查看进程打开的文件,又或是查看文件的进程信息,都能够很好的帮助用户了解相关服务的运行状态,是一个不错的系统监视工具

1. ls
# “list”,显⽰指定⼯作⽬录下的⽂件及属性信息
ls 
ls -a  # 显示所有文件及目录,包括隐藏文件
ls -l  # 使用长格式详细列出文件及目录的详细信息
ls -t  # 根据最后的修改时间排序
ls -S  # 根据文件大小排序
ls -x  # 按文件扩展名排序
ls -R  # 递归列出所有子目录
ls -d  # 查看目录的信息,而不是里面子文件的信息

ls -l  # 会显示出文件/目录的详细信息
### 显示信息
lrwxrwxrwx   1 root root    7 Dec 7 10:41 /usr/lib
位置 简介
第一个字符 表示文件类型;'-'表示普通目录;'d'为目录;'l'为符号链接;'b'为块设备文件;'c'为字符设备文件
第2~4个字符 权限,分别为读(r)、写(w)、执行(x),这个位置表示的是文件所有者对文件的权限,r、w、x 对应数字则为 4、2、1
第5~7个字符 表示同组用户的权限
第8~10个字符 表示其他用户的权限

权限除了'r' 'w' 'x' 外,还有:

's':当文件被执行时,把该文件的UID或GID赋予执行进程的UID或GID

't':设置标志位,即留在内存,不被换出。如果文件为目录,则目录中的文件只能被文件所有者或root用户删除。如果是可执行文件,则在执行后,指向其征文段的指针仍留在内存,方便再次执行。

'-':没有设置权限

后续 文件/目录权限管理 会有相应的修改方法

2. cat
# 全称 “concatenate”,⽤于查看⽂件内容,并将⽂件内容直接打印在终端
# 基本格式
cat [参数] ⽂件
###
cat -n filename # 显⽰⾏数(空⾏也编号)
cat -s filename # 显⽰⾏数(多个空⾏算⼀个编号)
cat -b filename # 显⽰⾏数(空⾏不编号)

3. more
# ⽤于分⻚显⽰⽂本⽂件内容。如果⽂本⽂件中的内容较多较⻓,使⽤cat命令读取后则很难看清,
# 这时使⽤more命令进⾏分⻚查看就更加合适了,可以把⽂本内容⼀⻚⼀⻚的显⽰在终端界⾯上,
# ⽤⼾每按⼀次回⻋即向下⼀⾏,每按⼀次空格即向下⼀⻚,直⾄看完为⽌
# 基本格式
more [参数] ⽂件
###
more -f filename # 计算实际的⾏数,⽽⾮⾃动换⾏的⾏数
more -s filename # 多个空⾏压缩成⼀⾏显⽰(不要在查看代码的时候使⽤这个选项)
more -u filename # 禁⽌下划线
more +num filename # 从第 num ⾏开始显⽰
more +/pattern filename # 在每个⽂档显⽰前搜寻该字(pattern),然后从该字串之后开始显⽰

4. less
# 和 more 命令类似,但 more 命令只能从前向后浏览文件内容
# 而 less 命令则不仅能从前向后(PageDown键),还可以从后向前(PageUp键)浏览
# 基本格式
less [参数] ⽂件
###
less -e filename # 当⽂件显⽰结束后⾃动退出
less -i filename # 忽略搜索时的⼤⼩写
less -m filename # 显⽰阅读进度百分⽐
less -N filename # 显⽰每⾏的⾏号
less -s filename # 显⽰连续空⾏为⼀⾏
less -S filename # 在单⾏显⽰较⻓的内容,⽽不换⾏显⽰
less -X filename # 将TAB字符显⽰为指定个数的空格字符

# 关于 cat、more、less:
#     当截取全部内容时,三个命令的格式大体相同,但一般建议使用`less`,
#     因为less可以前后翻页
5. head
# ⽤于截取⽂件开头的内容,默认为前10⾏
# 语法格式:
head [参数] ⽂件
###
head -n <数字> filename # 定义显⽰⾏数
head -c <数字> filename # 指定显⽰头部内容的字符数
head -v filename # 总是显⽰⽂件名的头信息

6. tail
# ⽤于截取⽂件尾部内容,默认为后10⾏
# 语法格式:
tail [参数] ⽂件
### 上⾯ head 能⽤的选项 tail 都能⽤
tail -f filename # 持续显⽰⽂件最新追加的内容(这个选项感觉好玩⼀点)

# -n,默认截取文件前十行或后十行

5. 编辑文件

编辑单个文件:vim

在这部分要熟悉一个在Linux里很流行的程序,vivim

vim是vi的进阶版,但差别在哪也没查,一直在用 vim

Vim 教程_w3cschool 这个应该是比较详细的信息,以下写的只是常用的

这是除了重定向外唯一的在命令行修改文件内容的方式(大概)

  • 命令模式:使用命令进入后就是,此时是只读状态

  • 输入模式:命令模式下安'a'、'i'、'o'进入输入模式,可从键盘编辑文档

  • 底线模式:命令模式下输入':',然后可以对修改后的文件进行保存或退出

批量编辑文本文件:sed

文本和数据进行处理的编程语言:awk

1. vim fileName    # 使用后进入相应的文件
### 命令模式下,可以使用一些自带的命令,最常用的或许是 dd
# dd,删除当前行
# 5dd,删除当前行及其之后的 5 行,数字可更改
### 命令模式下,点击'a'进入 输入模式
### 输入模式下点击'Ecs' 退回命令模式
### 命令模式下使用 ':wq' 保存退出
# w , 将修改写入文件
# q ,退出 vim
# 有时候忘记用sudo编辑需要权限的文件,修改不能保存,不能正常退出
# ":wq",强制退出

2. sed

3. awk

6. 文件内容处理

文件内容排序:sort

文本内容统计:wc

比较两个文件的差异:comm、diff、cmp

合并两个文件:paste

字符转换工具:tr

去除文件中的重复行:uniq

连接两个文件:join

分割文件:split

修补文件:patch

筛选特定文本内容:grep、fgrep、egrep

按列提取文件内容:cut

作用:以指定的查找模式 搜索、匹配 参数内容

  • grep 一次只能搜索一个,可扩展正则表达式,一般使用这个命令而不是其他两个

  • egrep 可扩展正则表达式

  • fgrep 检索固定字符串

  • 这里的命令大多都需要结合重定向符才能对文件内容产生实际更改
1. sort [选项] 文件名
# 会将文件的内容按行排序,然后打印到终端

2. wc
# “Word count”,⽤于统计⽂件的字节数、单词数、⾏数等信息,
# 并将统计结果输出到终端界⾯
# 语法格式:
wc [参数] ⽂件
###
wc -w filename # 统计单词数
wc -c filename # 统计字节数
wc -l filename # 统计⾏数
wc -m filename # 统计字符数

3. comm
# 对两个已经排好序的文件进行比较
# 若没有任何选项则会把结果分成3行显示:第一行显示仅在第一个文件出现过的列
# 第二行显示仅在第二个文件出现过的列,第三行显示两个文件的交集
# 语法格式
comm [参数] 文件1 文件2
###
comm -1 file1 file2
comm -2 file1 file2
comm -3 file1 file2

4. diff
# different,逐行比较两个文件
# 参数主要用于忽略某些条件
# 语法格式
diff [参数] 文件1 文件2
### 
diff -a file1 file2      # 逐行比较文本文件
diff -b file1 file2      # 不检查空格字符的不同
diff -x file1 file2      # 不比较选项中所制定的文件或目录
diff -y file1 file2      # 以并列的方式先死后文件的异同之处
diff --brief file1 file2 # 仅判断两个文件是否不同
diff --left-colunm file1 file2  # 若连个文件某一行内容相同,仅在左侧边栏显示该行

5. cmp
# 用于比较两个任意类型的文件,若两个文件相同则默认不输出任何信息,
# 若两个文件不同,则会输出第一个不同之处的字符和列数编号,结果输出到标准输出
# 语法格式:
cmp [参数] [文件] [文件]
### 
cmp file1 file2
cmp -I file1 file2  # 标示出所有不一样的地方

6. paste
# 把每个文件以列对列的方式,一列列地加以合并
# 语法格式: 
paste [参数] [文件1] [文件2]
### 
[guyan@DrangonBoat ~]$ cat file_1
 aaa 
 bbb
[guyan@DrangonBoat ~]$ cat file_2
 AAA
 BBB
[guyan@DrangonBoat ~]$ paste file_1 file_2
 aaa     AAA
 bbb    BBB
# 选项 -d 设置新的分隔符,默认为空格或 tab 键
paste -d: file1 file2
# 选项 -s 会先将文件粘贴成一行,然后再合并
[guyan@DrangonBoat ~]$ paste -s file_1 file_2
aaa    bbb
AAA    BBB

7. tr
# transform,⼀款批量字符转换、压缩、删除的⽂本⼯具,
# 但仅能从标准输⼊中读取⽂本内容,需要与管道符或输⼊重定向操作符搭配使⽤
# 处理的内容可以是 字符串 或 文件
# 语法格式:
tr [参数] 字符串1 字符串2
###
# 将指定⽂件中的所有出现在字符串[a-z]中的字符都转换成⼤写字⺟
# 然后输出内容到终端界⾯
tr [a-z] [A-Z] < fileName
# 删除字符串 [0-9] 中出现的所有字符,然后输出内容到终端界⾯
tr -d [0-9] < fileName 
# -s 用于删除所有重复出现的字符序列
# 将指定文件中的多个相邻空行去重后输出内容到终端界面
tr -s "[\n]" < fileName 

8. uniq
# unique,用于去除文件中的重复内容行
# 注意,这个命令实际上并没有对文本进行操作,可以尝试与重定向符组合使用
# 语法格式:
uniq [参数] 文件
### 
uniq -c fileName  # 打印每行在文本中重复出现的次数
uniq -d fileName  #     每个重复纪录只出现一次
uniq -u fileName  # 只显示没有重复的纪录

9. join
# 将两个具有相同域的纪录给挑选出来,再将这些纪录所有的域放到一行
# 语法格式:
join [参数] [文件1] [文件2]
### 
[guyan@DrangonBoat ~]$ cat file.db 
 A li:20:men:anhui
 B wang:21:women:jiangsu
 C zhang:22:men:anhui
[guyan@DrangonBoat ~]$ cat file_hobby.db 
 A li:Song
 B wang:shopping
[guyan@DrangonBoat ~]$ join -t: file.db file_hobby.db 
 A li:20:men:anhui:Song
 B wang:21:women:jiangsu:shopping
# 选项
-a1或-a2    可以理解为数据库的左右连接
-i	        忽略大小写
-o	        设置结果显示的格式
-t	        改变域的分隔符
-v1或-v2	不显示共同域的纪录之外,-v1显示第一个文件没有共同域的纪录,-v2显示第二个文件中没有共同域的纪录
-1或-2	   -1用来设置文件1连接的域,-2用来设置文件2连接的域

10. split
# 将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件
# 语法格式:
split [参数] [切割文件][文件名]
### 选项
-b	指定每多少字节切成一个小文件
-C	与参数”-b”相似,但是在切 割时将尽量维持每行的完整性

11. patch
# 让用户利用设置修补文件的方式,修改,更新原始文件
# 语法格式:
patch [参数]
# https://www.linuxcool.com/patch

12. grep
# “global search regular expression and print out the line”
# ⽤于全⾯搜索的正则表达式,并将结果输出
# grep 命令执⾏时,会先取得⽂件内容和要检索的关键字,
# 如果这⼀份⽂件的某⼀⾏有字符串与关键字相匹配,就将这⼀⾏打印到终端上
# 直到⽐对完所有⽂件中的所有内容
# 语法格式
grep [参数] ⽂件
###
# 在当前⽬录中,查找后缀有 file 字样的⽂件中包含 test 字符串的⽂件,并打印出该字符串的⾏
grep test *file
# ls 获取了当前⽬录下的所有⽂件或⽬录名,在准备打印到终端的时候被抑制
# 管道符将抑制的信息(ls)传递给 grep,grep 会查找和 string 相匹配的字符串
# 如果有相匹配的字符串,就打印这⼀⾏,如果没有就继续查找下⼀⾏
ls | grep string

13. cut
# 按列提取文件内容,grep 命令仅能对关键词按行进行提取过滤
# 而cut命令则是可以根据指定的关键词信息,针对特定的列内容进行过滤
# 语法格式:
cut [参数] 文件
### 
-c	以字符为单位进行分割
-b	以字节为单位进行分割
-d	自定义分隔符,默认为制表符”TAB”
-f	显示指定字段的内容
-n	取消分割多字节字符

7. 查找文件

查找文件或目录:find、locate

查找二进制文件:which、whereis

1. find
# 根据给定的路径和条件查找相关⽂件或⽬录,可以使⽤的参数很多,并且⽀持正则表达式
# 结合管道符后能够实现更加复杂的功能
# 语法格式
find [路径] [参数]
### 以下所有查找命令都在 / (全局)下进⾏
find / -name string # 匹配名称
find / -perm string # 匹配权限(mode为完全匹配,-mode为包含即可)
find / -user username # 匹配所有者
find / -group gname # 匹配所有组
find / -size +50M # 匹配⽂件的⼤⼩,‘+’表⽰查找超过50M的⽂件,‘-’表⽰...
find / -prune ⽬录 [其它选项] # 忽略某个⽬录
find / -exec rm -rf {} \; # 后⾯可跟⽤于进⼀步处理搜索结果的命令
### 复杂实例
# 全盘搜索系统中所有后缀为.mp4的⽂件,并删除所有查找到的⽂件
# {} 表⽰所有匹配项的集合,也可以使⽤ grep 进⼀步筛选
find / -name *.mp4 -exec
rm -rf {} \;

2. locate
# ⽤于快速查找⽂件或⽬录,不同于 find 的全局搜索, locate 命令基于数据⽂件
# /var/lib/locatedb
# 语法格式:
locate [参数] ⽂件

3. which
# ⽤于查找命令⽂件,能够快速搜索⼆进制程序所对应的位置。
# 不关心程序的源代码和帮助文件,只关注命令本身所在的路径
# 语法格式
which [参数] ⽂件
### emmmmm,不⽤管参数了,直接接命令就可以
which ls
### 打印信息
/usr/bin/ls

4. whereis
# 和 which 类似,但会定位 二进制程序、源代码文件 和 man 手册页等相关文件路径
# whereis 速度很快,其在 Linux 创建的一个包含本地所有文件信息的数据库中查找
# 这个数据库每天通过⾃动执⾏updatedb命令更新⼀次,搜索最近新增文件可能查找不到
#语法格式
whereis [参数] [命令名]
###
whereis ls
whereis -b ls  # 查找二进制程序或命令
whereis -m ls  # 查找 man 手册文件
whereis -s ls  # 查找源代码文件

8. 文件链接

创建文件链接:ln

在上面 2. 文件系统结构 中,有下面内容,是一些箭头,从一个目录指向另一个目录,那就是链接,从一个路径指向另一个路径

有关于文件在硬盘上的组织(存储)形式我放到了第五章 第二节,可以跳过去看那一部分再返回来

tree / -L 1
### 显示信息
/
├── bin -> usr/bin
├── lib -> usr/lib
├── lib64 -> usr/lib

ln命令用于创建文件链接,是给系统中已有的某个文件指定一个可用于访问它的名称。可以设置新的文件名指定不同的访问权限,以控制对信息的共享和安全性问题。

链接有硬链接和软链接,这里不想说明它们的区别,知道怎么用着好用就行。

  • 硬链接:链接文件和被链接文件必须位于同一个文件系统中,并且不能建立指向目录的硬链接,此时,这个文件拥有多个有效路径名

  • 软链接:没有硬链接的那些限制,且软链接只是相当于Window下的快捷方式

# 不使用选项时,默认建立硬链接
ln fileName /home/guyan/Destop/fileHardLink
# 选项'-s',建立软链接,一般情况下我们都只使用软链接
ln -s fileName /home/guyan/Destop/fileSoftLink

9. 文件/目录权限管理

更改文件权限:chmod

更改文件所有者:chown

更改文件所属用户组:chgrp

设置权限掩码:umask

Linux系统中每一个文件都有一个所有者,同时具有一个足编号,表示该文件所属的组。

现在可以使用命令 ls -l 查看文件的权限,文件和目录的访问权限只有读、写、执行。这里要是忘了可以返回去看本章的第二节

一般情况下可以使用字符的形式更改用户权限,但也可以将权限字符转化为数字,为避免混淆,权限 r = 4 , w = 2, x = 1

# 查看一个文件的权限
ls -l fileName
### 显示信息
-rw-r--r-- 1 guyan guyan 20 Oct27日 03:59 fileName
1. chmod
# change mode,用于改变文件或目录权限
# 设置权限时可以使用数字法,亦可使用字母表达式,对于目录文件建议加入-R参数进行递归操作
# r=4,w=2,x=1
# 基本格式
chmod [who] [+|-|=] [mode] fileName
###
chmod g+r fileName
chmod a+x fileName
chmod ug+w,o-x fileName
# 还可以直接三个数字连在一起同时为 u g a 设置权限
chmod 777 fileName # 当然,一般不建议 777
选项 选项 简介
[who] u [user]对文件所有者的权限进行设置
g [group]对文件所有者的同组用户的权限进行设置
o [other]对其他用户的权限进行设置
a [all]对所有用户的权限进行设置
[+\ -\ =]
-
=
[mode] r、w、x 读、写、执行
s、t、u、g、o
2. chown
# Change owner,用于改变文件或目录的用户和用户组信息
# cp 命令会复制其权限设置,当一个用户复制一份文件给别人的时候,需要更改文件的所有者
# 语法格式:
chown [参数] 所属主:所属组 文件
# -R    递归改变
# -v    显示 chown 命令对文件的详细操作
# -c    显示所属信息变更信息
# -f    若该文件拥有者无法被更改也不要显示错误
# -h    只对于链接文件进行变更,而非真正指向的文件
### 例子
# 改变指定文件的所属主与所属组
chown root:root /etc/fstab
# 改变指定文件的所属主与所属组,并显示过程
chown -c linuxprobe:linuxprobe /etc/fstab

10. 文件压缩/解压缩

压缩文件:bzip2、zip

解压缩文件:bunzip2、gunzip、unrar、unzip

压缩/解压缩:gzip

查看压缩文件内容:zcat、zless、bzcat、bzless、tar

复制文件到归档包:cpio

压缩和解压缩的命令还有很多,命令选项都差不多

可能使用最多的是 tar、zip、unzip、unrar

如果需要一个图形化的压缩工具可以选用 Ark,如果是打包项目,用相应的 IDE 就行,这些压缩命令可以用,但有时后没必要

1. tar
# 用于压缩和解压缩文件,
# 能够制作出Linux系统中常见的.tar、.tar.gz、.tar.bz2等格式的压缩包文件
# 语法格式:
tar 参数 文件或目录
###
# https://www.linuxcool.com/tar
# 常用选项
-x	从归档文件中提取文件
-z	通过gzip指令压缩/解压缩文件,文件名最好为*.tar.gz
-j	通过bzip2指令压缩/解压缩文件,文件名最好为*.tar.bz2
-v	显示指令执行过程
-v	显示操作过程
-r	添加文件到已经压缩的文件

11. 文件传输与接收

文件传输工具:curl

下载网络文件:wget

1. curl
# CommandLine URL,用于在Shell终端界面中基于URL规则进行的文件传输工作。
# curl是一款综合的传输工具,可以上传也可以下载,支持HTTP、HTTPS、FTP等三十余种常见协议
# 语法格式:
curl [参数] 网址
### 
curl https://www.linuxcool.com  # 获取指定网站的网页源码
curl -O https://www.linuxprobe.com/docs/LinuxProbe.pdf  # 下载指定网站中的文件
# 下载指定文件服务器中的文件(用户名:linuxcool,密码:redhat):
curl -u linuxprobe:redhat ftp://www.linuxcool.com/LinuxProbe.pdf
### 选项
-o	指定新的本地文件名
-O	保留远程文件的原始名
-u	通过服务端配置的用户名和密码授权访问
-I	打印HTTP响应头信息
-u	指定登录账户密码信息
-C	支持断点续传
-T	上传文件

2. wget
# Web get,用于从指定网址下载网络文件
# wget 非常稳定,即便网络波动导致下载终止,也会不断的尝试重连,直至整个文件下载完毕
# 支持如HTTP、HTTPS、FTP等常见协议,可以在命令行中直接下载网络文件
# 语法格式: 
wget [参数] 网址
###
wget https://**/fileName  # 下载指定的网络文件

### 选项
-V	显示版本信息
-h	显示帮助信息
-b	启动后转入后台执行
-c	支持断点续传
-O	定义本地文件名
-e <命令>	执行指定的命令

12. 其它

输出字符串或提取后的变量:echo

改变根目录:chroot

1. echo
# 用于在终端设备上输出指定字符串或变量提取后值的命令,能够给用户一些简单的提醒信息
# 语法格式:
echo [参数] 字符串/变量
###
echo $PATH  # 输出当前环境变量
echo string  # 输出字符串到终端

2. chroot
# change root,用于把根目录换成指定的目录
# 这个命令一般只有在安装系统或重装系统的时候才会使用
# 语法格式:
chroot /path

三. 包管理

1. 包管理器类别

上面给Linux各种发行版分类的时候采用打包方式分类和这里的大体上类似

所有包管理的命令在网上都能找到比较全面的教程,下面是一些推荐教程

dpkg包管理器详解_Linux教程_Linux公社-Linux系统门户网站

技术|Linux 包管理基础:apt、yum、dnf 和 pkg

RPM包管理 - Gie - 博客园

pacman (简体中文) - ArchWiki

类别 打包工具 简介
Debian dpkg Debian家族基础包管理工具
apt 高级打包工具,是dpkg包管理的前端工具,众所周知,抽象层级越高越方便
aptitude 另一个非常常用的打包工具,工作方式类似apt,最初为Debian设计,但现在似乎在RedHat系列上也能看到它
synaptic 基于GTK+的APT的可视化包管理器,如果不想使用命令行的话可以试试这个
Rpm rpm 红帽创建的基本标准打包格式和基础包管理系统。基于这个底层系统,有多个前端包管理工具可以使用
yum 一个开源、流行的包管理器,和Apt具有大体相同的功能
dnf 基于Rpm的包管理器,可以说是下一代的yum,在新版的Fedora中dnf已经作为默认的包管理器
其它 Pacman ArchLinux的包管理器,用于 Arch Linux 和其他的一些小众发行版。简单易用
Zypper 使用 libzypp 库制作的用于 OpenSUSE 系统上的命令行包管理器
Portage Gentoo 的包管理器,被称为Linux下最好的包管理器
yay 基于Pacman的包管理器,可以作任何Pacman的操作并额外添加了其它用法

注意:通过包管理器安装的软件包是默认安装在根目录下的,不要轻易去改动安装位置

2. pacman

pacman (简体中文) - ArchWiki

pacman 是 Arch Linux 上的一个包管理器,官方的库和第三方库都可以用 pacman 进行管理

pacman 配置⽂件位于 /etc/pacman.conf
pacman 的镜像列表位于 /etc/pacman.d/mirrorlist
pacman 下载安装软件包时会将软件包保存在 /var/cache/pacman/pkg/

## ⽰例
# 从 aur 安装⼀个软件包
pacman -S konsole
# 从本地安装⼀个软件包
pacman -U /path/to/package/package_name-version.pkg.tar.zst
# 安装⼀个远程包(不在 pacman 配置的源⾥⾯)
pacman -U http://www.example.com/repo/example.pkg.tar.zst
# 升级软件包
pacman -Syu
# 删除单个软件包,保留其全部已经安装的依赖关系
pacman -R package_name
# 删除单个软件包,及其所有没有被其他已安装软件包使⽤的依赖关系
pacman -Rs package_name
# 上⾯这条命令在移除包含其他所需包的组时有时候会拒绝运⾏。这种情况下可以尝试
pacman -Rsu package_name
# 要删除软件包和所有依赖这个软件包的程序(不建议使⽤,可能破坏其它包的依赖关系)
pacman -Rsc package_name
# 删除⼀个被其他软件包依赖的软件包,但是不删除依赖这个软件包的其他软件包
pacman -Rdd package_name
# 如果需要显⽰包的详细信息可以添加选项`-i`
# 通过查询本地软件包数据库查看是否存在某软件包
pacman -Q package_name
# 查询已安装的软件包(string 可以忽略,但那会显⽰出所有软件包)
pacman -Qs string1 string2 ...
# 通过查询⽂件数据库查看是否存在某软件包
pacman -F package_name
# 在包数据库中查询软件包,查询位置包含了软件包的名字和描述
pacman -Ss package_name
# 显⽰软件包的依赖树,需要安装 pacman-contrib
pactree package_name
# 清理软件包缓存
# pacman 将下载的软件包保存在 /var/cache/pacman/pkg/ 并且不会⾃动移除旧的和未安装版本的软件包
paccache -r # 默认保留最近的三个版本
paccache -rk1 # 清理并只保存⼀个版本
# 删除⽬前没有安装的所有缓存的包,和没有被使⽤的同步数据库
pacman -Sc
# 删除缓存中的全部⽂件,使⽤两次-c开关。这是最为激进的⽅式,将会清空缓存⽂件夹
pacman -Scc

3. yay

pacman 是 Arch 上的自带包管理器,但通常却使用 yay 作为日常使用的包管理器,yay 可以执行 pacman 的大部分操作,并在此基础上添加很多额外的用法

## ⽰例
# 升级软件包
yay -Syu
# 在 AUR 中查询包(string 可使⽤正则表达式)
yay -q string
# 删除⼀个软件包
yay -Rs packafe_name
# 其它操作⼤体上与 pacman 等同

四. 桌面系统

Linux 现使用最多的是两个桌面系统:KDE 和 Gnomw。这两个发展到现在基本上都差不多,一般在安装系统时,如果是完全安装,都默认安装一个桌面

如果想美化桌面,可以找一些 Linux 桌面美化教程,但要做好投入大量时间的准备

桌面 简介
KDE KDE
Gnome Gnome

五. 硬件管理

Linux 中一切都是文件,包括所有的硬件,硬件以文件的形式保存在系统中(/dev),但我们不能直接修改硬件文件,当需要管理硬件的时候,更多的是去修改配置文件(/etc)

1. CPU & GPU

# 前情提要:/proc 是虚拟的文件系统,也是系统内核的镜像,存储当前内核运行状态的一系列文件
# 可以通过查询 /proc 下的文件 查看、理解 内核是怎么监管系统的

# 查看电脑硬件——CPU,
cat /proc/cpuinfo
# 筛选去除一些无用信息
cat /proc/cpuinfo | grep 'model name' | uniq

# 查看电脑硬件——GPU
lspci 
lspci | grep -i nvidia  # 英伟达显卡
nvidia-smi              # 英伟达显卡

2. 硬盘

这里需要插入 Linux 文件存储形式

linux中文件索引节点知识_weixin_34133829的博客-CSDN博客

软连接和硬链接区别 - matengfei - 博客园

即使是到了现在,SmartMontools依旧是一款比较流行的硬盘检测工具

# Arch 上安装 SmartMontools
yay -q smartmontools
# 其它,前往官网下载相应的软件包
# https://sourceforge.net/projects/smartmontools/files/smartmontools/7.3/smartmontools-7.3.tar.gz/download
# 下载后进行解压和安装,注意不要直接复制下面的命令,可能版本不同
wget https://sourceforge.net/projects/smartmontools/files/smartmontools/7.3/smartmontools-7.3.tar.gz/download
tar zxvf smartmontools-7.3.tar.gz 
cd smartmontools-7.3
./configure
make
sudo make install

# 开始进行检测.`-i`测试主办和硬盘是否支持 smart 技术,能打印出一堆东西就成功了
sudo smartctl -i /dev/sda 
sudo smartctl -i /dev/sda1
# 选项`-A`显示的是检测道德硬盘数据部分
sudo smartctl -A /dev/sda1

查看硬盘的数据、类型等信息

# 查看电脑硬件——硬盘
lsblk
df -a              # 查看使用率
df  /dev/sda1   # 查看单一分区的使用率
sudo fdisk -l     # 同查看,信息更详细

# 查看某个文件使用的数据块
du        # disk usage,逐级进入指定目录

3. 内存

# 监控 真实内存 使用情况
free
# 监控 虚拟 内存使用情况(Virtual Meomory Statistics)
vmstar
# 如果还想检测得更仔细,可以用第三方工具,书上推荐:memtest86

4. 管理磁盘

硬盘命名方式

/dev/sda: sd 指 SCSI 硬盘,用a,b,c,d,e等代表第几块

/dev/hda: hd 指 IDE 硬盘,...

/dev/sda1: 最后的数字是指在这块硬盘上的第几个分区

配置硬盘

# /etc/fstab 用于定义磁盘分区,各种其他块设备或远程文件系统应如何装入文件系统
cat /etc/fstab    # 查看本机的fstab文件
### 部分显示信息
# /dev/sda1
UUID=d3ea83a0-a67a-44ed-9020-3ad52fce3544       /home           ext4            rw,relatime     0 2

其基本书写规则为:
<file system>    <dir>    <type>    <options>    <dump>    <pass>
# 更详细的介绍请查看:
# https://wiki.archlinux.org/title/Fstab_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
# 为设备持久化命名,最好使用 UUID,这是每个硬盘分区的唯一名字
lsblk -f           # 查看磁盘设备的 UUID
blkid /dev/sda1    # 查看磁盘设备的 UUID

为系统永久添加一个硬盘

# 检查系统已添加但未挂载的硬盘
sudo fdisk -l     # 假设 /dev/sdb 未挂载
# 转化硬盘类型
parted /dev/sdb
(parted)mktable             #输入mktable
New disk label type? gpt    #输入gpt 将磁盘类型转换为gpt 如磁盘有数据会警告,输入yes即可
quit     
# 划分分区并选定文件系统
sudo cfdisk /dev/sdb
# cfdisk 是一个好用的半图形化的程序,这里假设将整个硬盘划分为一个分区 /dev/sdb1
# 根据需求划分分区,type 一般为 Linux file system
# 格式化硬盘,一般可选 ext4,如果有需求可以选其他
mkfs.etx4 /dev/sdb1
# 建个目录,作为挂载点
mkdir /home/guyan/movic
mount /dev/sdb1 /home/guyan/movic
# 查看硬盘的UUID
blkid /dev/sdb1
# 修改 /etc/fstab,参考上面的 配置硬盘
sudo vim /etc/fstab
### 例如,添加
# /dev/sdb1
UUID=cb279989-9ef6-4cb9-ab31-656c18f40849    /home/guyan/movic       ext4            rw,relatime     0 2

5. 优化系统硬盘

  • 删除无用文件

  • 整理磁盘碎片。最好的方法是做一个完整的备份之后,重新格式化分区

  • 调整硬盘参数。在 RedHat 上可以试试 hdparm,但无论是服务器还是本机,我的建议都是:没有保存重要 文件的条件下,不要尝试


参考:

posted @ 2022-10-28 12:41  故魇  阅读(86)  评论(0编辑  收藏  举报