Linux 文件与目录管理

1. Linux 文件种类与扩展名

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

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

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

  • “-” 普通文件(Regular File)
    • 文本文件(Text File):包含人类可读的文本字符,例如 .txt.c.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:设备文件目录,包含了系统中的硬件设备对应的文件。
  • /etc:存放系统的配置文件,如用户账号、服务启动配置等。
  • /root:超级用户(root)的主目录。
  • /home:普通用户的主目录,每个用户在该目录下有一个以用户名命名的子目录。
  • /lib:系统库文件,包含了系统运行所需的共享库。
  • /lib64:64 位系统的库文件。
  • /media:用于挂载可移动设备,如 U 盘、光盘等。
  • /mnt:临时挂载文件系统的挂载点。
  • /opt:可选的应用程序安装目录。
  • /proc:虚拟文件系统,提供了系统运行时的内核和进程信息。
  • /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 ,隐藏文件通常是以 . 开头的文件。
  • 以长格式列出
    • 使用 -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 的文件。

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 安装