1、Linux文件系统概述
Linux文件系统是指操作系统用来控制文件如何存储和检索的结构和逻辑。
文件系统结构
- 根目录:
/
- Linux文件系统从根目录(
/
)开始,这是所有文件和目录的起点。
- Linux文件系统从根目录(
- 目录结构: Linux使用层次化目录结构,每个目录包含文件和子目录。
- 挂载点: 各种文件系统通过挂载点(mount point)集成到文件系统的层次结构中。
文件类型
- 普通文件: 包含数据的文件(文本文件、二进制文件等)。
- 目录文件: 也称为文件夹,包含其他文件或子目录。
- 链接文件: 指向另一个文件的指针,可以是硬链接或软链接。
- 设备文件: 代表设备的特殊文件,分为字符设备文件和块设备文件。
- 管道文件: 用于进程间通信的文件。
根目录概述
在Linux操作系统中,根目录(/
)是整个文件系统的起点。所有文件和目录都是从根目录开始的,根目录下包含了系统所需的各种子目录,每个子目录都有其特定的用途。
根目录下的常用文件夹及其用途 (仅作了解)
-
/bin
:- 存放基本命令的二进制文件,如
ls
,cp
,mv
,bash
等,系统启动和单用户模式下需要使用这些命令。
- 存放基本命令的二进制文件,如
-
/etc
:- 存放系统配置文件和子目录,如网络配置文件、用户账户信息、服务配置文件等。
-
/home
:- 每个用户的主目录的默认位置,例如用户
user
的主目录为/home/user
。用户的个人文件和设置通常存放在这里。
- 每个用户的主目录的默认位置,例如用户
-
/lib
:- 存放系统运行所需的共享库文件和内核模块。包括程序执行时依赖的共享库文件,如
/lib/libc.so.6
,头文件等。
- 存放系统运行所需的共享库文件和内核模块。包括程序执行时依赖的共享库文件,如
-
/var
:- 存放系统运行时需要改变的数据文件,如日志文件、缓存文件、邮件队列等。
-
/dev
:- 包含设备文件,用于访问硬件设备,例如磁盘、终端、音频设备等。每个设备都表示为一个文件,如
/dev/sda
表示第一个SCSI硬盘。
- 包含设备文件,用于访问硬件设备,例如磁盘、终端、音频设备等。每个设备都表示为一个文件,如
-
/proc
:- 虚拟文件系统,包含系统进程和内核信息的虚拟文件。提供系统信息,如内存、CPU等。
-
/root
:- 超级用户(root)的主目录。与普通用户的主目录不同,位于
/home
之外。
- 超级用户(root)的主目录。与普通用户的主目录不同,位于
-
/srv
:- 存放服务(service)相关的数据,如HTTP服务器的网页文件、FTP服务器的数据等。
-
/tmp
:- 存放临时文件,系统重启后该目录下的文件会被删除。
-
/usr
:- 存放用户应用程序和文件,包括二进制文件、库文件、文档等。包含子目录:
/usr/bin
: 存放用户命令的二进制文件。/usr/lib
: 存放用户命令的库文件。/usr/local
: 存放本地安装的软件。
- 存放用户应用程序和文件,包括二进制文件、库文件、文档等。包含子目录:
根目录结构图
下面是一张根目录下常用文件夹的结构图:
/
├── bin
├── etc
├── home
│ ├── user1
│ └── user2
├── lib
├── proc
├── root
├── dev
├── srv
├── tmp
├── usr
│ ├── bin
│ ├── lib
│ ├── local
│ │ ├── bin
│ │ └── lib
│ └── share
├── var
├── log
├── mail
├── cache
└── tmp
2、路径
路径是指文件或目录在文件系统中的位置。路径分为绝对路径和相对路径。
绝对路径
绝对路径是从根目录(/
)开始,逐级指定文件或目录的路径。绝对路径总是唯一的,并且不依赖于当前工作目录。
- 示例:
/home/user/docs/file.txt
在这个例子中,路径从根目录开始,依次经过home
、user
、docs
目录,最后指向file.txt
文件。
相对路径
相对路径是从当前工作目录开始,逐级指定文件或目录的路径。相对路径依赖于当前工作目录,可以使用相对路径操作文件和目录而不需要知道它们的绝对位置。
- 示例:
- 当前目录:
/home/user
- 相对路径:
docs/file.txt
- 当前目录:
在这个例子中,相对路径docs/file.txt
指向的是/home/user/docs/file.txt
文件。
特殊目录符号
.
: 当前目录..
: 上一级目录~
: 当前用户的主目录(通常是/home/username
)
3、基本命令
1. ls
- 列出目录内容
ls
:显示当前目录下的文件和目录。ls -l
:以长格式显示文件和目录的详细信息,包括权限、所有者、文件大小和修改时间。ls -a
:显示所有文件和目录,包括隐藏文件(以.
开头的文件)。ls -lh
:以长格式和人类可读的格式显示文件大小(例如,KB、MB)。ls -R
:递归地列出所有子目录中的文件。
2. cd
- 切换目录
cd
:返回用户的主目录。cd /path/to/directory
:切换到指定目录。cd ..
:返回上一级目录。cd -
:返回到上一个工作目录。
3. mkdir
- 创建目录
mkdir directory_name
:创建一个名为directory_name
的新目录。mkdir -p /path/to/directory
:递归创建目录路径中的所有目录(如果它们不存在)。
4. touch
- 创建文件
touch filename
:创建一个名为filename
的新文件,或者如果文件已存在,则更新其修改时间。
5. pwd
- 显示当前目录
pwd
:显示当前工作目录的绝对路径。
6. cat
- 连接并显示文件
cat filename
:显示filename
文件的内容。cat file1 > file2
:将file1
的内容复制到file2
(覆盖)。cat file1 >> file2
:将file1
的内容追加到file2
。
7. cp
- 复制文件或目录
cp source destination
:将文件source
复制到destination
。cp -r source_directory destination_directory
:递归复制目录及其内容。cp -i source destination
:在覆盖文件时提示确认。
8. mv
- 移动或重命名文件或目录
mv source destination
:将文件或目录source
移动到destination
,或者重命名为destination
。mv -i source destination
:在覆盖文件时提示确认。
9. rm
- 删除文件或目录
rm filename
:删除filename
文件。rm -r directory
:递归删除目录及其内容。rm -f filename
:强制删除文件而不提示确认。rm -rf directory
:强制递归删除目录及其内容而不提示确认。
10. 重启系统
sudo reboot
11. 关闭某个进程
-
找出进程的 PID(进程ID)
# ps aux 和 | 下面会讲 ps aux | grep tmux 或 pgrep process_name
-
使用
kill
命令来终止进程。kill PID # 发送默认关闭的请求 kill -9 PID # 强制关闭
4、常用命令
1. chmod
- 更改文件权限
权限可以用两种方式表示:符号表示法和八进制表示法。
符号表示法
- r:读权限(read)
- w:写权限(write)
- x:执行权限(execute)
使用符号表示法时,权限可以分配给用户(u)、组(g)和其他人(o)。
八进制表示法
- 4:读权限(read)
- 2:写权限(write)
- 1:执行权限(execute)
符号表示法示例
-
给文件所有者添加读、写和执行权限
chmod u+rwx filename
-
给文件组添加读和执行权限
chmod g+rx filename
-
给其他人添加读权限
chmod o+r filename
-
给所有用户(用户、组和其他人)添加读、写和执行权限
chmod a+rwx filename chmod +rwx filename # 默认是给所有的用户
八进制表示法示例
-
给文件所有者、组和其他人添加读、写和执行权限
chmod 777 filename
这里的
777
表示用户、组和其他人都拥有读(4)+写(2)+执行(1)= 7 的权限。 -
给文件所有者添加读、写和执行权限,组和其他人添加读和执行权限
chmod 755 filename
这里的
755
表示用户拥有读(4)+写(2)+执行(1)= 7 的权限,而组和其他人拥有读(4)+执行(1)= 5 的权限。
2. chown
- 更改文件所有者
用于更改文件或目录的所有者。
chown user:group filename
:将文件filename
的所有者改为user
,组改为group
。chown -R user:group directory
:递归更改目录及其内容的所有者。
3. find
- 查找文件
用于在目录中搜索文件。
find /path -name filename
:在/path
目录下查找名为filename
的文件。find /path -type d
:在/path
目录下查找所有目录。find /path -type f -name "*.txt"
:在/path
目录下查找所有扩展名为.txt
的文件。
4. grep
- 搜索文本
用于在文件或标准输入中搜索匹配的文本。
grep "pattern" filename
:在filename
中搜索pattern
字符串。grep -r "pattern" /path
:递归搜索目录/path
中的pattern
字符串。grep -i "pattern" filename
:在filename
中搜索pattern
字符串(忽略大小写)。grep -v "pattern" filename
:在filename
中显示不包含pattern
的行。
5. w
- 显示当前登录用户及其活动信息
用于查看当前登录的用户及其相关的活动信息。
w
:显示当前系统中的登录用户及其活动信息。w -h
:不显示标题行,只显示用户的活动信息。
6. wc
- 统计文件中的字数、行数和字节数
wc
(word count)命令用于计算文件中的行数、字数和字节数。
wc filename
:显示filename
文件的行数、字数和字节数。wc -l filename
:仅显示filename
文件的行数。wc -w filename
:仅显示filename
文件的字数。wc -c filename
:仅显示filename
文件的字节数。
7. ag
- 超速文件内容搜索工具
ag
(the silver searcher)是一个用于快速搜索文件内容的工具,类似于 grep
但速度更快。
ag <关键字>
:在当前目录及其子目录中搜索包含关键字的文件内容。ag -i <关键字>
:不区分大小写地搜索关键字。ag -w <关键字>
:匹配整个单词。ag --ignore <模式>
:忽略匹配指定模式的文件或目录。
8. xargs
- 从标准输入构建并执行命令
xargs
命令用于将标准输入转换为命令行参数,通常用于与其他命令结合使用。
echo "file1 file2 file3" | xargs rm
:删除文件file1
、file2
和file3
。find . -name "*.txt" | xargs grep "hello"
:在当前目录及其子目录中的所有.txt
文件中查找包含 “hello” 的行。ls | xargs -I {} mv {} /backup/
:将当前目录中的所有文件移动到/backup/
目录。find . -type f -print0 | xargs -0 rm -f
:安全地删除当前目录及其子目录中的所有文件(处理文件名中包含空格的情况)。
5、 系统信息的命令
1. top
- 实时显示系统进程信息
用于动态查看系统中运行的进程及其资源使用情况。
top
:显示当前系统中的进程列表,按CPU使用率排序。top -u <用户名>
:显示指定用户的进程信息。top -p <PID>
:仅显示特定进程的信息。
2. df
- 报告文件系统磁盘空间使用情况
用于查看文件系统的磁盘使用情况。
df -h
:以人类可读的格式(如GB,MB)显示磁盘使用情况。df -T
:显示文件系统类型。df -i
:显示文件系统的inode使用情况。
3. free
- 显示内存使用情况
用于查看系统内存和交换空间的使用情况。
free -h
:以人类可读的格式显示内存和交换空间使用情况。free -m
:以MB为单位显示内存使用情况。free -g
:以GB为单位显示内存使用情况。
4. du
- 估算文件和目录的磁盘使用空间
用于查看目录或文件的大小。
du -h
:以人类可读格式显示目录或文件的大小。du -sh <目录或文件>
:显示特定目录或文件的总大小。du -a
:显示目录下所有文件和目录的大小。
5. ps aux
- 显示系统中所有进程的详细信息
用于查看系统中的所有进程及其状态。
ps aux
:列出系统中所有进程及其详细信息。ps aux | grep <进程名>
:过滤并显示特定进程的信息。ps aux --sort=-%mem
:按内存使用率降序排列进程。
2. tree
- 显示目录结构的树形图
tree
命令用于以树形结构显示目录及其子目录和文件。
tree
:以树形结构显示当前目录的内容。tree <目录名>
:以树形结构显示指定目录的内容。tree -L <层级>
:限制显示的目录层级深度。tree -d
:仅显示目录,不显示文件。
6、管道
定义
管道是Linux中用来将一个命令的输出作为另一个命令的输入的机制。它允许将多个命令串联起来执行,使数据在命令之间传递。管道使用竖线符号 |
来表示。
管道的用法
command1 | command2 | command3
在上面的例子中,command1
的输出会传递给 command2
,然后 command2
的输出会传递给 command3
。
常用管道命令:(获取某些文件一共有多少行)
# 获取以.py结尾的文件内容一共有多少行
find . -name "*.py" | xargs wc -l | tail -n 1
1. find . -name "*.py":
find 命令在当前目录(用 . 表示)及其子目录中查找所有以 .py 结尾的文件。
-name "*.py" 指定匹配以 .py 结尾的文件。
2. xargs wc -l:
xargs 将前一个命令的输出(即所有找到的 .py 文件路径)作为参数传递给后一个命令。
wc -l 统计每个文件的行数,并输出每个文件的行数以及总行数。
3. tail -n 1:
wc -l 的输出会列出每个文件的行数,最后一行是总行数。tail -n 1 命令提取 wc -l 的最后一行,显示总行数。
7、环境变量
定义
环境变量是操作系统中一类用于存储有关操作系统环境的信息的变量。它们是由操作系统提供和维护的,能够影响程序的行为和系统的操作。环境变量在不同操作系统中存在,尤其在UNIX和Linux系统中被广泛使用。
作用
环境变量的作用主要包括:
- 存储系统信息:例如当前用户的主目录、系统路径等。
- 配置程序行为:某些程序可以通过读取环境变量来决定其运行方式。
- 简化操作:使用环境变量可以简化
如何查看当前环境变量
你可以使用以下命令来查看当前系统中已设置的环境变量:
-
env
:显示当前用户的环境变量。这是最常用的命令,可以列出所有你在当前环境中可用的变量。env
-
set
:显示当前 shell 中的所有变量,包括环境变量和 shell 的局部变量。使用set
可以看到更多的信息。set
-
export
:显示当前 shell 中已导出的环境变量。这些变量可以被启动的子进程继承。export
-
echo $变量名
:查看某个具体环境变量的值。例如,查看PATH
环境变量的值:echo $PATH
修改环境变量
有时候你可能需要修改或增加某个环境变量,比如将一个新的程序路径添加到 PATH
中。这个修改可以在当前会话中生效,也可以永久生效。
1. 临时修改环境变量
-
直接在命令行中修改,这种修改只对当前会话有效。
示例:将
/usr/local/bin
添加到PATH
中:export PATH=$PATH:/usr/local/bin
修改后,
/usr/local/bin
会被加入到系统搜索可执行文件的路径列表中。但如果你关闭终端,修改就会失效。
2. 永久修改环境变量
-
如果你希望环境变量的修改在每次启动 shell 时都生效,可以将修改写入到用户的配置文件中,比如
~/.bashrc
。步骤:
-
打开
~/.bashrc
文件(这个文件在用户的主目录下,存储着 shell 启动时加载的配置)。nano ~/.bashrc
-
将你希望修改的命令添加到文件的末尾。比如,要永久添加
/usr/local/bin
到PATH
中,添加以下行:export PATH=$PATH:/usr/local/bin
-
保存文件并退出编辑器(在
nano
中按Ctrl + O
保存,Ctrl + X
退出)。 -
使修改立即生效,不用重新启动 shell:
source ~/.bashrc
-
3. 为什么要放到 .bashrc
中?
.bashrc
是每次启动 Bash shell 时自动执行的脚本。将环境变量的修改写入.bashrc
,可以确保每次启动 shell 时,环境变量都会按你的设置生效。- 示例场景:
- 每次登录到系统时,shell 都会加载
.bashrc
,因此你定义的环境变量会自动应用。 - 当你通过
ssh
登录远程服务器时,~/.bashrc
也会被执行。 - 如果你使用
tmux
开启新窗口或者面板,~/.bashrc
中的设置也会生效。
- 每次登录到系统时,shell 都会加载
常见的环境变量
以下是一些常见的环境变量及其用途:
-
HOME
:用户的家目录路径,比如/home/yourname
。很多程序使用这个变量来存放配置文件或日志。 -
PATH
:可执行文件搜索路径,系统在执行命令时会按顺序搜索这些目录。使用:
作为分隔符。加入一个新的路径后,系统会在这个路径下寻找命令。 -
LD_LIBRARY_PATH
:指定动态链接库的搜索路径,类似PATH
,但用于寻找共享库文件。 -
C_INCLUDE_PATH
和CPLUS_INCLUDE_PATH
:用于 C 和 C++ 编译器寻找头文件的路径。 -
PYTHONPATH
:Python 解释器搜索模块的路径,如果你有自定义模块,可以将其路径加入到PYTHONPATH
中。 -
JAVA_HOME
:指定 JDK 的安装路径,很多 Java 工具和框架会使用这个变量来寻找 Java 编译器和库。 -
CLASSPATH
:Java 查找类文件和库的路径。