MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Bash中的目录结构与文件系统

2023-12-163.2k 阅读

Bash 基础:目录结构概述

在深入探讨 Bash 与文件系统的交互之前,先明晰 Linux 文件系统的目录结构至关重要。Linux 采用树形目录结构,根目录(/)作为整个文件系统的起点。从根目录出发,衍生出众多子目录,每个子目录又可包含文件和其他子目录,形成一个层次分明的体系。

常见目录及其用途

  1. /bin:存放系统基本命令,如 lscpmv 等。这些命令是系统正常运行所必需的,在系统启动早期就可被访问,并且对普通用户和超级用户都可用。例如,当你在终端输入 ls 查看目录内容时,实际上就是调用了 /bin/ls 这个可执行文件。
# 查看 /bin 目录下的文件
ls /bin
  1. /sbin:该目录主要存放系统管理命令,通常只有系统管理员(root 用户)能够执行。像 shutdownreboot 等系统维护和管理相关的命令就位于此目录。比如要重启系统,执行的 reboot 命令实际路径是 /sbin/reboot
# 以 root 权限查看 /sbin 目录下的文件
sudo ls /sbin
  1. /etc:存放系统的配置文件。几乎所有系统服务和应用程序的配置信息都在这里,比如网络配置文件(/etc/network/interfaces)、用户账户信息(/etc/passwd/etc/shadow)以及系统启动脚本等。以网络配置为例,通过编辑 /etc/network/interfaces 文件,可以设置网络接口的 IP 地址、子网掩码、网关等参数。
# 查看网络配置文件
sudo cat /etc/network/interfaces
  1. /home:普通用户的主目录所在地。每个用户都有一个以其用户名命名的子目录在 /home 下,用户的个人文件、配置文件等通常存放在这里。例如,用户 john 的主目录就是 /home/john,他可以在这个目录下自由创建、修改和删除文件。
# 切换到当前用户主目录
cd ~
# 查看主目录下的文件
ls
  1. /root:系统管理员(root 用户)的主目录。与普通用户主目录类似,但只有 root 用户可以访问,用于存放 root 用户的个人配置和文件。
# 切换到 root 用户主目录(需 root 权限)
sudo su -
cd /root
ls
  1. /usr:包含了大量的用户应用程序和文件,类似于 Windows 系统中的 “Program Files” 目录。它又包含多个子目录,如 /usr/bin 存放用户可执行程序,/usr/lib 存放程序库文件等。许多从软件包管理器安装的应用程序会将其文件放置在 /usr 及其子目录下。
# 查看 /usr/bin 目录下的文件
ls /usr/bin
  1. /var:用于存放经常变化的数据,如日志文件(/var/log)、邮件文件(/var/mail)以及缓存文件等。日志文件记录了系统和应用程序的运行信息,对于故障排查和系统监控非常重要。例如,/var/log/syslog 文件记录了系统的各种事件。
# 查看系统日志文件
sudo cat /var/log/syslog
  1. /tmp:临时文件目录,所有用户都可以在此创建和删除文件。系统在重启时通常会清空此目录,因此适合存放那些临时使用后不需要长期保留的文件。比如一些应用程序在运行过程中生成的临时文件可以放在这里。
# 在 /tmp 目录下创建一个临时文件
touch /tmp/tempfile.txt
# 查看 /tmp 目录下的文件
ls /tmp

在 Bash 中操作目录

Bash 提供了一系列强大的命令来操作目录,这些命令是我们与文件系统交互的重要工具。

切换目录(cd 命令)

cd 命令用于在文件系统的目录树中移动,是日常使用频率极高的命令之一。

  1. 切换到指定目录:要切换到指定目录,只需在 cd 后跟上目标目录的路径。例如,要切换到 /etc 目录,执行:
cd /etc
  1. 切换到用户主目录:可以使用 cd 命令不带任何参数,或者使用 ~ 符号来切换到当前用户的主目录。
cd
# 或者
cd ~
  1. 切换到上一级目录:使用 cd.. 命令可以切换到当前目录的上一级目录。例如,如果你当前在 /home/user/Documents 目录,执行 cd.. 后会切换到 /home/user 目录。
cd..
  1. 切换到前一个工作目录:Bash 提供了 cd - 命令,用于快速切换回前一个工作目录。假设你从 /home/user 目录切换到了 /var/log 目录,此时执行 cd - 就会回到 /home/user 目录。
cd -

创建目录(mkdir 命令)

mkdir 命令用于创建新的目录。

  1. 创建单个目录:最简单的用法是在 mkdir 后跟上要创建的目录名。例如,在当前目录下创建一个名为 newdir 的目录:
mkdir newdir
  1. 创建多级目录:如果要创建的目录包含多级子目录,而父目录可能不存在时,可以使用 -p 选项。比如要创建 /parent/child/grandchild 这样的目录结构,而 /parent/parent/child 目录可能都不存在,执行:
mkdir -p parent/child/grandchild
  1. 设置目录权限:在创建目录时,可以使用 -m 选项来指定新目录的权限。例如,创建一个权限为 755(所有者有读、写、执行权限,组用户和其他用户有读、执行权限)的目录:
mkdir -m 755 newdir_with_perm

删除目录(rmdir 命令)

rmdir 命令用于删除空目录。

  1. 删除单个空目录:在 rmdir 后跟上要删除的目录名即可。例如,删除当前目录下名为 emptydir 的空目录:
rmdir emptydir
  1. 删除多级空目录:与 mkdir-p 选项类似,rmdir 也有 -p 选项,用于删除多级空目录。例如,要删除 parent/child/grandchild 这样的目录结构(前提是它们都是空目录):
rmdir -p parent/child/grandchild

需要注意的是,如果目录不为空,rmdir 命令会失败。要删除非空目录,需要使用 rm -r 命令(rm 命令会在后续文件操作部分详细介绍)。

查看目录内容(ls 命令)

ls 命令是查看目录内容最常用的命令,它可以显示目录中的文件和子目录列表,并且有丰富的选项来定制显示方式。

  1. 基本用法:直接执行 ls 命令会列出当前目录下的文件和子目录的简单列表,不包含隐藏文件(文件名以 . 开头的文件)。
ls
  1. 显示详细信息:使用 -l 选项可以显示文件和目录的详细信息,包括文件类型、权限、所有者、组、大小、修改时间等。例如:
ls -l

在详细列表中,第一列表示文件类型和权限,以 -rw-r--r-- 为例,第一个字符 - 表示这是一个普通文件,r 表示读权限,w 表示写权限,x 表示执行权限。接下来三个字符一组分别对应所有者、组用户和其他用户的权限。 3. 显示隐藏文件:使用 -a 选项可以显示当前目录下的所有文件,包括隐藏文件。

ls -a
  1. 显示所有信息并按时间排序:结合 -l-t 选项,可以按文件修改时间对文件和目录进行排序,最新修改的文件排在最前面。
ls -lt
  1. 递归显示目录内容:如果要递归显示一个目录及其所有子目录的内容,可以使用 -R 选项。例如,要查看 /etc 目录及其所有子目录下的文件和目录:
ls -R /etc

在 Bash 中操作文件

除了目录操作,Bash 也提供了众多命令来对文件进行创建、删除、复制、移动等操作。

创建文件(touch 命令)

touch 命令主要用于创建新的空文件,或者更新已有文件的时间戳。

  1. 创建新文件:在 touch 后跟上文件名即可创建一个新的空文件。例如,在当前目录下创建一个名为 newfile.txt 的文件:
touch newfile.txt
  1. 更新文件时间戳:如果文件已经存在,执行 touch 命令会更新文件的访问时间和修改时间为当前时间。例如,对已有的 oldfile.txt 文件执行 touch 命令:
touch oldfile.txt
  1. 同时创建多个文件:可以在 touch 命令后跟上多个文件名,一次性创建多个文件。例如:
touch file1.txt file2.txt file3.txt

删除文件(rm 命令)

rm 命令用于删除文件或目录(删除目录时需配合 -r 选项)。

  1. 删除单个文件:在 rm 后跟上要删除的文件名。例如,删除当前目录下的 unwantedfile.txt 文件:
rm unwantedfile.txt
  1. 强制删除文件:默认情况下,rm 命令在删除文件前会提示确认。如果不想看到确认提示,可以使用 -f 选项强制删除文件。但要谨慎使用此选项,因为一旦执行,文件将无法恢复。例如:
rm -f unwantedfile.txt
  1. 删除多个文件:在 rm 命令后跟上多个文件名,可以一次性删除多个文件。例如:
rm file1.txt file2.txt file3.txt
  1. 删除目录及其内容:要删除非空目录及其所有子目录和文件,需要使用 -r 选项(递归删除)。例如,删除名为 mydir 的目录及其所有内容:
rm -r mydir

同样,使用 -rf 组合可以强制递归删除,不提示确认信息,但这种操作极其危险,务必确认无误后再执行。

复制文件和目录(cp 命令)

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

  1. 复制文件:基本语法是 cp source_file destination,其中 source_file 是要复制的源文件,destination 是目标路径,可以是目录或新的文件名。例如,将当前目录下的 file.txt 文件复制到 /tmp 目录:
cp file.txt /tmp

如果要在复制时给文件取一个新名字,比如将 file.txt 复制为 /tmp/newfile.txt,可以这样操作:

cp file.txt /tmp/newfile.txt
  1. 复制目录:复制目录需要使用 -r 选项,以递归方式复制目录及其所有子目录和文件。例如,将 mydir 目录复制到 /backup 目录:
cp -r mydir /backup
  1. 保留文件属性:使用 -p 选项可以在复制文件时保留文件的权限、所有者、时间戳等属性。例如:
cp -p file.txt /destination

移动文件和目录(mv 命令)

mv 命令既可以用于移动文件和目录,也可以用于重命名文件和目录。

  1. 移动文件:语法为 mv source_file destination,与 cp 命令类似,但 mv 操作后源文件会被删除。例如,将 file.txt 从当前目录移动到 /var/tmp 目录:
mv file.txt /var/tmp
  1. 移动目录:同样可以移动目录,例如将 mydir 目录移动到 /newlocation 目录:
mv mydir /newlocation
  1. 重命名文件或目录:当 destination 是一个新的文件名或目录名时,mv 命令就起到了重命名的作用。例如,将 oldfile.txt 重命名为 newfile.txt
mv oldfile.txt newfile.txt

对于目录重命名,比如将 olddir 重命名为 newdir

mv olddir newdir

理解文件权限

在 Linux 文件系统中,文件权限是保障系统安全和数据完整性的重要机制。每个文件和目录都有一组权限,定义了不同用户对其的访问级别。

文件权限的表示方法

  1. 字符表示法:文件权限通过 r(读)、w(写)、x(执行)这三个字符来表示,分别对应不同的访问权限。权限分为三组,依次是所有者权限、组用户权限和其他用户权限。例如,-rw-r--r-- 表示这是一个普通文件,所有者有读和写权限,组用户和其他用户只有读权限。
  2. 数字表示法:文件权限也可以用数字来表示,其中 r 对应数字 4,w 对应数字 2,x 对应数字 1,没有权限则用 0 表示。将每组权限对应的数字相加,就得到一个三位数字的权限表示。比如 755,其中 7 表示所有者权限(4 + 2 + 1,即读、写、执行权限都有),5 表示组用户权限(4 + 1,读和执行权限),5 表示其他用户权限(4 + 1,读和执行权限)。

修改文件权限(chmod 命令)

chmod 命令用于修改文件和目录的权限。

  1. 使用字符表示法修改权限:基本语法是 chmod [who] [+|-|=] [permissions] file,其中 who 可以是 u(所有者)、g(组用户)、o(其他用户)或 a(所有用户);+ 表示添加权限,- 表示删除权限,= 表示设置权限;permissionsrwx 等权限字符。例如,给文件 file.txt 的所有者添加执行权限:
chmod u+x file.txt
  1. 使用数字表示法修改权限:使用数字表示法更为简洁,直接在 chmod 后跟上三位数字的权限值和文件名。例如,将文件 file.txt 的权限设置为 644
chmod 644 file.txt
  1. 递归修改目录权限:如果要递归修改一个目录及其所有子目录和文件的权限,可以使用 -R 选项。例如,将 mydir 目录及其所有内容的权限设置为 755
chmod -R 755 mydir

修改文件所有者和组(chown 命令)

chown 命令用于改变文件或目录的所有者和所属组。

  1. 修改所有者:语法为 chown new_owner file,其中 new_owner 是新的所有者用户名,file 是要修改所有者的文件或目录。例如,将 file.txt 的所有者改为 newuser
sudo chown newuser file.txt
  1. 修改所属组:可以使用 chown :new_group file 的形式来修改文件的所属组,其中 new_group 是新的组名。例如,将 file.txt 的所属组改为 newgroup
sudo chown :newgroup file.txt
  1. 同时修改所有者和所属组:使用 chown new_owner:new_group file 可以同时修改文件的所有者和所属组。例如:
sudo chown newuser:newgroup file.txt
  1. 递归修改目录:与 chmod 类似,chown 也可以使用 -R 选项递归修改目录及其所有子目录和文件的所有者和所属组。例如:
sudo chown -R newuser:newgroup mydir

链接文件

在 Linux 文件系统中,链接文件是一种特殊的文件类型,它可以让一个文件以不同的名字或路径存在,方便用户在不同位置访问相同的数据。链接文件分为硬链接和软链接(符号链接)。

硬链接(ln 命令)

硬链接通过为文件创建额外的目录项,使多个文件名指向同一个文件数据块。这意味着硬链接和原始文件实际上是同一个文件的不同名称,它们具有相同的 inode 编号(inode 是文件在文件系统中的唯一标识)。

  1. 创建硬链接:使用 ln 命令创建硬链接,语法为 ln source_file link_file,其中 source_file 是源文件,link_file 是要创建的硬链接文件名。例如,为 file.txt 创建一个硬链接 hardlink.txt
ln file.txt hardlink.txt
  1. 硬链接的特点:硬链接不能跨越文件系统,即不能为不同分区的文件创建硬链接。而且硬链接只能针对文件,不能为目录创建硬链接。当删除源文件时,只要还有硬链接存在,文件的数据仍然保留,只有当所有硬链接都被删除时,文件的数据才会真正被删除。

软链接(符号链接,ln -s 命令)

软链接(符号链接)是一种特殊的文件,它包含了对另一个文件的引用,类似于 Windows 系统中的快捷方式。软链接有自己独立的 inode 编号,它指向的目标文件可以是不同文件系统中的文件,也可以是目录。

  1. 创建软链接:使用 ln -s 命令创建软链接,语法为 ln -s source_file link_file。例如,为 file.txt 创建一个软链接 symlink.txt
ln -s file.txt symlink.txt
  1. 软链接的特点:当删除软链接时,不会影响目标文件;但当删除目标文件时,软链接将成为无效链接(通常显示为 “broken link”)。软链接可以跨越文件系统,灵活性更高。

高级文件系统操作

除了上述基本的目录和文件操作,Bash 还提供了一些高级的文件系统操作命令,用于处理更复杂的任务。

查找文件(find 命令)

find 命令是一个功能强大的文件查找工具,可以根据文件名、文件类型、文件大小、修改时间等多种条件在指定目录及其子目录中查找文件。

  1. 按文件名查找:基本语法为 find directory -name "filename_pattern",其中 directory 是要查找的目录,filename_pattern 是文件名模式,可以使用通配符(如 * 表示任意字符序列,? 表示任意单个字符)。例如,在 /home/user 目录及其子目录中查找所有以 .txt 结尾的文件:
find /home/user -name "*.txt"
  1. 按文件类型查找:使用 -type 选项可以指定文件类型,f 表示普通文件,d 表示目录,l 表示符号链接等。例如,在 /var 目录及其子目录中查找所有目录:
find /var -type d
  1. 按文件大小查找:可以使用 -size 选项按文件大小查找文件。例如,查找 /home/user 目录及其子目录中大于 100KB 的文件:
find /home/user -size +100k
  1. 按修改时间查找:使用 -mmin-mtime 等选项可以按文件修改时间查找文件。-mmin 以分钟为单位,-mtime 以天为单位。例如,查找 /var/log 目录及其子目录中在过去 24 小时内修改过的文件:
find /var/log -mtime 0

文本处理(grep 命令)

grep 命令用于在文件中搜索指定的文本模式,并显示包含该模式的行。它是文本处理和日志分析中常用的工具。

  1. 基本搜索:语法为 grep "pattern" file,其中 pattern 是要搜索的文本模式,file 是要搜索的文件名。例如,在 file.txt 文件中搜索包含 “error” 的行:
grep "error" file.txt
  1. 递归搜索目录中的文件:使用 -r 选项可以递归搜索指定目录及其子目录中的所有文件。例如,在 /var/log 目录及其子目录中搜索包含 “warning” 的行:
grep -r "warning" /var/log
  1. 忽略大小写:使用 -i 选项可以在搜索时忽略大小写。例如:
grep -i "Error" file.txt

归档与压缩(tar 命令)

tar 命令用于创建、提取和管理归档文件,通常与压缩工具(如 gzipbzip2 等)结合使用,以减少文件占用的空间。

  1. 创建归档文件:基本语法为 tar -cvf archive.tar files_or_directories,其中 -c 表示创建归档文件,-v 表示显示详细信息,-f 后跟上归档文件名,后面是要归档的文件或目录列表。例如,将 mydir 目录归档为 mydir.tar
tar -cvf mydir.tar mydir
  1. 压缩归档文件:与 gzip 结合使用,使用 -z 选项,将 mydir 目录归档并压缩为 mydir.tar.gz
tar -zcvf mydir.tar.gz mydir
  1. 提取归档文件:使用 -x 选项提取归档文件,例如提取 mydir.tar.gz
tar -zxvf mydir.tar.gz
  1. 查看归档文件内容:使用 -t 选项可以查看归档文件中包含的文件和目录列表,例如查看 mydir.tar.gz 的内容:
tar -ztvf mydir.tar.gz

通过对 Bash 中目录结构与文件系统相关操作的深入了解,我们能够更加高效地管理和操作 Linux 文件系统,无论是系统管理、开发工作还是日常使用,这些知识和技能都具有重要的实用价值。在实际应用中,根据不同的需求灵活运用这些命令和工具,将有助于我们更好地完成各项任务。