Linux 文件与目录管理

1. Linux 文件种类与扩展名

在 Linux 系统中文件后缀名(扩展名,例如:.txt、.mp4、.jpg等)没有意义,通常加上后缀名只是为了方便识别。

在 Linux 命令行输入 ls -l file_name 可以查看一个文件的详细信息,其中第一个字符标识文件种类。

以下是对 Linux 文件种类的详细介绍:

  • “-” 普通文件(Regular File)
    • 文本文件(Text File):包含人类可读的文本字符,例如 .txt、.html 等。
    • 二进制文件(Binary File):以二进制格式存储的数据,例如可执行程序(.exe 、.bin )、图像文件(.jpg 、.png )、压缩文件(.zip 、.tar.gz )等。
  • “d” 目录文件(Directory)
    • 用于组织和分类文件,包含其他文件和子目录的信息。目录类似于 Windows 中的文件夹。
  • 链接文件(Link File)
    • “l” 软链接(Symbolic Link):也称为符号链接,是一个指向另一个文件或目录的特殊文件。如果目标文件被删除或移动,软链接将失效。
    • 硬链接(Hard Link):硬链接与原始文件共享相同的 inode(索引节点),对硬链接的修改会反映在原始文件上,反之亦然。删除原始文件不会影响硬链接的可用性,直到所有硬链接都被删除。硬链接文件的文件类型与原始文件相同,例如,如果原始文件是普通文件,那么其硬链接的文件类型也是普通文件。
  • 设备文件(Device File)
    • “c” 字符设备文件(Character Device File):以字符为单位进行输入/输出操作,例如键盘、鼠标、串口等,通常位于 /dev 目录下,例如 /dev/tty1 。
    • “b” 块设备文件(Block Device File):以数据块为单位进行输入/输出操作,例如硬盘、光盘等,通常位于 /dev 目录下,例如 /dev/sda 。
  • “p” 管道文件(Pipe)
    • 分为命名管道(Named Pipe)和匿名管道(Anonymous Pipe)。用于进程间通信,数据在管道中按照先进先出的原则流动。
  • “s” 套接字文件(Socket)
    • 用于网络通信,进程可以通过套接字进行数据交换。

2. Linux 常见目录结构与作用

  • /bin:存放常用的二进制命令,如 lscatmkdir 等。
  • /sbin:存放系统管理员使用的系统管理程序。
  • /boot:包含了系统启动所需的文件,如内核、引导加载程序等。
  • /dev:设备文件目录,包含了系统中的硬件设备对应的文件。
    • /dev/cdrom 和 /dev/sr0,系统光盘镜像设备
    • /dev/null,黑洞设备,只进不出
    • /dev/random,生成随机数的设备
    • /dev/zero,能源源不断地产生数据
    • /dev/pts/0,虚拟的Bash Shell终端,提供给远程用户使用 0 代表第一个终端 1 代表第 2 个终端以此类推
    • /dev/stderr,错误输出
    • /dev/stdin,标准输入
    • /dev/stdout,标准输出
  • /etc:存放系统的配置文件,如用户账号、服务启动配置等。
    • /etc/sysconfig/network-script/,网络配置文件目录
    • /etc/hostname,系统主机名配置文件
    • /etc/resolv.conf,dns 客户端配置文件
    • /etc/hosts,本地域名解析配置文件
    • /etc/fstab 系统挂载目录开机自启动挂载列表
    • /etc/passwd 系统用户文件
  • /root:超级用户(root)的主目录。
  • /home:普通用户的主目录,每个用户在该目录下有一个以用户名命名的子目录。
  • /lib:系统库文件,包含了系统运行所需的共享库。
  • /lib64:64 位系统的库文件。
  • /media:用于挂载可移动设备,如 U 盘、光盘等。
  • /mnt:临时挂载文件系统的挂载点。
  • /opt:可选的应用程序安装目录。
  • /proc:虚拟文件系统,提供了系统运行时的内核和进程信息。
    • /proc/meminfo 内存信息
    • /proc/cpuinfo cpu信息
  • /run:存放系统运行时的数据,如进程 ID、锁文件等。
  • /srv:服务特定的数据目录。
  • /sys:类似于 /proc,也是一个虚拟文件系统,提供了内核设备、驱动等的信息。
  • /tmp:临时文件目录,系统重启时会清空。
  • /usr:包含了用户程序和文件,如应用程序、库文件、文档等。
  • /var:经常变化的数据,如日志文件、邮件队列等。

3. 绝对路径与相对路径概念

在文件系统中,绝对路径和相对路径是用于指定文件或目录位置的两种方式。相对路径更简洁,适用于在同一目录层次结构内进行操作;绝对路径则无论在任何位置都能准确无误地定位到目标。

  • 绝对路径:是指从根目录开始的完整路径,它准确地指定了文件或目录在文件系统中的位置。
    • 示例:在 Linux 系统中,/home/user/documents/file.txt 就是一个绝对路径,在 Windows 系统中,C:\Users\Username\Documents\file.txt 是绝对路径。
  • 相对路径:是指相对于当前工作目录的路径。如果当前工作目录是 /home/user ,那么对于同一系统中的 documents/file.txt 就是一个相对路径。相对路径不以根目录开头,而是基于当前所在的位置来描述如何到达目标文件或目录。

4. 文件与目录管理常用命令

4.1. 查看文件与目录

pwd

显示当前工作目录的绝对路径。

  • -L:若当前的工作目录是个符号链接,它会显示符号链接路径,此为pwd命令默认参数。
  • -P:若当前的工作目录是个符号链接,它会显示符号链接所指向的实际路径。

cd

更改当前工作目录。

  • 切换到指定目录
    • cd /path/to/directory ,其中 /path/to/directory 是要切换到的目录的完整路径。
  • 切换到上一级目录
    • 使用 cd.. 可以切换到当前目录的父目录。
  • 切换到用户主目录
    • 输入 cd 或 cd ~ 都可以切换到当前用户的主目录。
  • 切换到指定用户的主目录
    • cd ~username ,其中 username 是指定用户的用户名,将切换到该用户的主目录。
  • 切换到最近访问的目录
    • 如果之前从一个目录切换到另一个目录,然后想快速返回之前访问过的目录,可以使用 cd – 。

ls

列出目录中的文件和子目录。

  • 基本用法
    • 直接输入 ls 命令,将列出当前工作目录中的文件和子目录。
  • 列出指定目录
    • ls /path/to/directory ,其中 /path/to/directory 是要列出内容的目录路径。
  • 列出所有文件(包括隐藏文件)
    • 使用 -a 选项:ls -a ,隐藏文·1件通常是以 . 开头的文件。
  • 以长格式列出
    • 使用 -l 选项:ls -l ,会显示文件的详细信息,如权限、所有者、大小、修改时间等。
  • 按文件大小排序
    • 使用 -S 选项:ls -S ,将按照文件大小从大到小排序。
  • 按时间排序
    • -t 选项按修改时间排序,最新修改的文件排在前面。
    • ls -lt 按修改时间升序排列(从旧到新)。
    • ls -ltr 按修改时间降序排列(从新到旧)。
  • 显示 inode 号
    • 使用 -i 选项:ls -i ,会显示文件的 inode 号。
  • 递归列出子目录内容
    • 使用 -R 选项:ls -R ,会递归地列出当前目录及其子目录中的内容。
  • 结合多个选项
    • 例如,ls -al 同时列出所有文件(包括隐藏文件)并以长格式显示。

find

用于在指定目录下查找文件和目录。语法:find [路径] [表达式]

  • 路径:是要查找的目录路径,可以是一个目录或文件名,也可以是多个路径,多个路径之间用空格分隔。如果未指定路径,则默认为当前目录。
  • 表达式:指定搜索的条件和操作。
  • 常见的表达式选项
    • -name :按照文件名查找。
      • 示例:find /home -name "*.txt" 在 /home 目录及其子目录中查找所有扩展名为 .txt 的文件。
    • -type :按照文件类型查找。常见的文件类型有 f(普通文件)、d(目录)、l(符号链接)等。
      • 示例:find / -type d 在根目录及其子目录中查找所有目录。
    • -size :按照文件大小查找,可以使用 +- 来指定大于或小于某个大小,单位可以是c(字节)、k(千字节)、M(兆字节)等。
      • 示例:find /var -size +10M 在 /var 目录及其子目录中查找大于 10MB 的文件。
    • -mtime :按照文件修改时间查找,可以使用 +- 来指定在某个时间之前或之后的文件,单位可以是-n(n天前)或+n(n天后)。
      • 示例:find /etc -mtime -7 在 /etc 目录及其子目录中查找 7 天内修改过的文件。
    • -exec :对找到的文件执行指定的命令。
      • 示例:find /tmp -name "*.log" -exec rm {} \; 在 /tmp 目录中删除所有扩展名为 .log 的文件。
    • -user :按照文件所有者查找。
      • 示例:find /home -user username 在 /home 目录及其子目录中查找属于指定用户 username 的文件。

which

返回第一个在 $PATH 环境变量中匹配到的可执行文件路径。

  • 用法示例:which ip,添加 -a 选项显示所有匹配的路径(而不仅是第一个)

cat

用于查看、创建、连接文件。

  • 显示文件内容
    • 直接指定文件名作为参数,cat file.txt 将会显示 file.txt 的全部内容。
  • 合并多个文件
    • 可以同时指定多个文件名,cat file1.txt file2.txt 会依次显示 file1.txt 和 file2.txt 的内容。
  • 从标准输入读取内容
    • 当不指定文件名时,cat 会从标准输入(通常是键盘)读取数据,直到用户按下 Ctrl + D 组合键结束输入,并将输入内容显示出来。
  • 配合重定向操作
    • 如 cat file.txt > new_file.txt ,将 file.txt 的内容重定向输出到新文件 new_file.txt 中,如果 new_file.txt 已存在,会覆盖其原有内容。
    • cat file.txt >> new_file.txt ,将 file.txt 的内容追加到 new_file.txt 的末尾。
  • 显示行号
    • 使用 -n 选项显示文件内容并在每一行的前面加上行号,cat -n file.txt 。
    • 使用 -b 选项显示文件内容并为非空白行添加行号,cat -b file.txt 。
    • 使用 -s 选项压缩连续的空白行为一行,cat -s file.txt 。
  • 显示非打印字符
    • 使用 -v 或 -T 选项可以显示不可打印的字符。-v 选项会以可见的方式显示控制字符和其他非打印字符,-T 选项会将制表符显示为 ^I 。
  • 结合其他命令使用
    • 可以将 cat 的输出作为其他命令的输入,通过管道 | 进行连接。

less

用于分页查看文件内容的命令行工具。

  • 基本用法
    • less filename ,其中 filename 是要查看的文件的名称。
  • 浏览文件
    • 按空格键:向下翻一页。
    • 按回车键:向下滚动一行。
    • b 键:向上翻一页。
    • y 键:向上滚动一行。
  • 搜索
    • 输入 /pattern ,然后按回车键,查找文件中匹配 pattern 的内容。
    • 按 n 键查找下一个匹配项,按 N 键查找上一个匹配项。
  • 退出
    • 按 q 键退出 less 。
  • 显示行号
    • 输入 :num ,其中 num 是要显示的行号,将直接跳转到指定行。
  • 其他操作
    • h 键:显示帮助信息。
    • G 键:跳转到文件末尾。
    • g 键:跳转到文件开头。
  • 结合管道使用
    • 可以与其他命令结合使用,例如 cat large_file.txt | less ,用于查看大型文件的内容。

head

用于查看文件的开头部分内容。

  • 基本用法
    • head filename ,其中 filename 是要查看的文件名称。默认情况下,它会显示文件的前 10 行内容。
  • 指定行数
    • head -n num filename ,其中 -n 表示指定行数,num 是要显示的行数。例如,head -n 20 filename 会显示文件的前 20 行。
  • 多个文件
    • 可以同时指定多个文件,例如 head file1.txt file2.txt ,将分别显示每个文件的前 10 行内容。
  • 结合管道使用
    • 可以与其他命令结合使用,通过管道将输出传递给 head 。例如,command | head ,其中 command 是产生输出的命令。

tail

用于查看文件的末尾部分内容。

  • 基本用法
    • tail filename,其中filename是要查看的文件名称。默认情况下,它会显示文件的最后10行内容。
  • 指定行数
    • tail -n num filename,其中-n表示指定行数,num是要显示的行数。例如,tail -n 20 filename会显示文件的最后20行。
  • 实时查看文件更新
    • tail -f filename,其中-f表示实时查看文件更新。它会一直监视文件的末尾内容,并在文件有更新时实时显示。
  • 结合管道使用
    • 可以与其他命令结合使用,通过管道将输出传递给tail。例如,command | tail,其中command是产生输出的命令。

4.2. 创建、复制、移动、删除文件与目录

touch

用于创建新的空文件,如果文件已存在,则会更新文件的访问时间和修改时间。

  • 创建一个新的空文件:touch filename
    • 例如:touch newfile.txt 将会在当前目录创建一个名为 newfile.txt 的空文件。
  • 同时创建多个文件:touch file1 file2 file3
  • 更新文件的时间戳:如果指定的文件已经存在,touch 命令会更新其访问时间和修改时间为当前系统时间。
  • 指定特定的时间来更新时间戳:
    touch -t [[CC]YY]MMDDhhmm[.ss] filename 其中,CC 表示年份的前两位,YY 表示年份的后两位,MM 表示月份(01 – 12),DD 表示日期(01 – 31),hh 表示小时(00 – 23),mm 表示分钟(00 – 59),ss 表示秒(00 – 60)。
    • 例如:touch -t 202307131230 file.txt 会将 file.txt 的时间戳设置为 2023 年 7 月 13 日 12 点 30 分。

mkdir

用于在 Linux 和其他类 Unix 操作系统中创建新的目录。

  • 基本语法:mkdir directory_name 其中 directory_name 是要创建的目录的名称。
    • 示例:mkdir new_directory 这将在当前工作目录下创建一个名为 new_directory 的新目录。
  • 常用选项:
    • -p :可以创建多级目录。如果中间目录不存在,会一并创建。
      • 示例:mkdir -p parent/child/subchild 这将创建 parent 目录、parent/child 目录和 parent/child/subchild 目录。
    • -v :显示创建目录的详细信息。
      • 示例:mkdir -v new_dir 执行时会显示创建目录的过程信息。
    • -m :创建目录并设置权限。
      • 示例:mkdir -m 755 new_dir

cp

用于在 Linux 和其他类 Unix 操作系统中复制文件和目录。

  • 基本语法:cp source destination 其中,source 是要复制的源文件或目录,destination 是复制的目标位置。
  • 常用选项:
    • -r 或 -R :递归复制目录及其内容,包括子目录和文件。
    • -i :在覆盖目标文件之前提示确认。
    • -v :显示详细的复制过程。
    • -f :强制覆盖目标文件,不提示。
  • 示例:
    • 复制文件:cp file.txt new_file.txt
    • 复制目录(包括其内容):cp -r directory new_directory
    • 复制多个文件到一个目录:cp file1.txt file2.txt destination_directory
    • 强制复制并显示详细信息:cp -fv file.txt destination.txt

mv

用于在 Linux 和其他类 Unix 操作系统中用于移动或重命名文件和目录。

  • 基本语法:mv source destination 其中,source 是要移动或重命名的源文件或目录,destination 是移动的目标位置或新的文件名。如果 destination 是一个已存在的目录,source 会被移动到该目录下。
  • 常用选项:
    • -i :如果目标文件已存在,会提示用户是否覆盖。
    • -f :强制覆盖目标文件,不提示。
    • -v :显示详细的移动过程。
  • 示例:
    • 移动文件:mv file.txt /new/location/file.txt
    • 移动目录:mv directory /new/location/directory
    • 重命名文件:mv old_file.txt new_file.txt
    • 重命名目录:mv old_directory new_directory
    • 强制移动并显示详细信息:mv -fv file.txt destination.txt

rm

用于在 Linux 和其他类 Unix 操作系统中用于删除文件或目录。

  • 基本语法:rm file_or_directory
  • 常用选项:
    • -r 或 -R :递归删除目录及其内容。
    • -f :强制删除,不提示确认。
    • -i :在删除前提示确认。
    • -v :显示详细的删除过程。
  • 示例:
    • 删除文件:rm file.txt
    • 删除空目录:rmdir directory # 或者使用 rm 命令加上 -d 选项:rm -d directory
    • 删除非空目录及其内容:rm -r directory
    • 强制删除文件,不提示:rm -f file.txt
    • 递归强制删除目录及其内容,不提示:rm -rf directory

4.3. 修改文件内容

4.3.1. vi 与 vim 编辑器

vi 编辑器是 Linux 系统的一款默认编辑器,它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制。
vim 编辑器是 vi 编辑器的升级版,vi 不显示高亮颜色语法,vim显示高亮颜色语法。
默认vi 是安装的 , vim 需要通过 yum install vim -y 安装。

常用命令
  • 基本操作
    • vim 文件名 打开文件
    • :q 退出
    • :q! 强制退出(不保存)
    • :w 保存
    • :wq 或 :x 保存并退出
    • :w 新文件名 另存为
    • ZZ 保存并退出(普通模式下)
  • 移动光标(普通模式)
    • h j k l 左、下、上、右
    • 0 跳到行首
    • $ 跳到行尾
    • gg 跳到文件第一行
    • G 跳到文件最后一行
    • :n 跳到第 n 行(如 :10
    • Ctrl + f 向下翻页(Page Down)
    • Ctrl + b 向上翻页(Page Up)
  • 编辑文本
    • 删除与复制
      • dd 删除当前行
      • dw 删除当前单词
      • yy 复制当前行
      • yw 复制当前单词
    • 撤销与重做
      • u 撤销
      • Ctrl + r 重做
  • 查找与替换
    • /关键词 向前搜索(按 n 下一个,N 上一个)
    • :%s/旧/新/g 全局替换(所有匹配)
    • :s/旧/新/g 当前行替换
    • :n1,n2s/旧/新/g 替换第 n1 到 n2 行的内容
  • 可视化模式
    • Ctrl + v 进入块选择模式(列编辑)
    • 示例:多行行首添加注释(如 #
      • Ctrl + v + 上下键 选中多行的第一列。
      • 按 I,输入 #,按 Esc

4.3.2. sed、awk、grep

详细介绍见 shell 篇

4.4. 文件上传与下载

wget

# 基本下载
wget https://example.com/file.zip  # 文件会保存到当前目录,文件名与远程一致。

# 指定保存路径和文件名
wget -O /tmp/archive.tar.gz https://example.com/file.tar.gz

# 断点续传
wget -c https://example.com/large-file.iso  # 如果下载中断,重新运行此命令会从中断处继续。

# 后台下载
wget -b https://example.com/file.zip  # 日志会写入当前目录的 wget-log 文件。

# 递归下载(整站或目录)
## 常用选项:
## -np:不追溯至父目录。
## -l [深度]:限制递归深度。
## -A [扩展名]:仅下载指定类型文件(如 -A "*.pdf")。
## -R [扩展名]:排除指定类型文件(如 -R "*.jpg")。
wget -r -l 2 -A "*.pdf" https://example.com  # 下载网站内所有 PDF,深度为 2

# ps:如果 wget下载提示无法建立 SSL 连接,则加上选项 --no-check-certificate
wget --no-check-certificate [URL]
Bash

curl

# curl 命令是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。
curl -o 123.png https://www.xxx.com/img/hello.png
 
# ps: 如果遇到下载提示无法简历 SSL 链接,使用 -k 选项或者 --insecure
curl -k -o 123.png https://www.xxx.com/img/hello.png
 
# 下载远程脚本并直接在本地执行
curl -s http://example.com/test.sh | bash  # -s 代表静默模式,会屏蔽掉 curl 命令本身的输出
Bash

sz 与 rz

# 系统默认没有该命令,需要下载:yum install lrzsz -y
# 将服务器上选定的文件下载到本地
sz bak.tar.gz

# 从本地选择文件上传到服务器。
rz
# 如果文件已经存,则上传失败,可以用 -E 选项解决
rz -E  # -E 如果目标文件名已经存在,则重命名传入文件。新文件名将添加一个点和一个数字(0..999)
# 如果上传文件出现乱码可以添加 -be 选项
rz -be
# -b 二进制模式(避免转义字符处理),-e 转义控制字符(防止特殊符号被解析)。
Bash

4.5. 文件压缩与解压

zip 与 unzip

zip -rq etc.zip /etc
# zip 后的第一个参数是压缩包路径及文件名,后面的为被压缩的文件
# 选项:-r 递归压缩,-q 静默输出。

# 选项:-l 显示压缩包的列表信息,-q 静默输出,-d 解压到指定的目录。
unzip -q xxx.zip -d /opt
Bash

tar

# 打包
tar cvf etc_bak.tar /etc/  # c 创建归档,v 显示详细过程,f 指定归档文件名和路径

# 压缩
gzip etc_bak.tar  # 文件体积变小,并且加上后缀.gz
# gzip -> gunzip
# bzip2-> bunzip2
 
# 上述两步可以合二为一
tar czvf etc1_bak.tar.gz /etc/  # 选项 z 代表 gzip 压缩算法
tar cjvf etc1_bak.tar.bz2 /etc/  # 选项 j 代表 bzip2 压缩算法

# xxx.tar.gz 或者 xxx.tar.bz2 解压命令相同
tar xvf 压缩包 -C 解压到的目录  # 无需指定解压算法,tar会自动判断
Bash
上一篇
下一篇