Linux 文件目录管理实战指南:从目录结构到 cp/mv/rm 全命令详解
【免费下载链接】linux-tutorial:penguin: Linux教程,主要内容:Linux 命令、Linux 系统运维、软件运维、精选常用Shell脚本项目地址: https://gitcode.com/GitHub_Trending/lin/linux-tutorial
Linux 采用树形目录结构与"一切皆文件"的哲学,文件目录管理是系统运维与日常操作的基础。本文以 linux-tutorial 项目的 docs/linux/cli/linux-cli-dir.md 为骨架,系统讲解 Linux 目录结构、文件属性与权限模型,并逐一剖析
cd、ls、mkdir、find、cp、mv、rm、scp等 19 个核心命令的常用用法,最后结合仓库内真实 Shell 脚本(安全删除、目录批量操作、文件路径解析等)给出可落地的实战方案。读完本文,你将能够独立完成目录规划、权限控制、文件查找、批量复制移动与跨服务器传输等日常任务。
1. Linux 文件目录工作机制
1.1. Linux 目录结构
Linux 目录结构是树形结构,其根目录是/。所有文件与目录都从根目录出发,形成一棵倒置的树。下表整理了常见目录的作用,便于快速对照:
| 目录 | 作用 |
|---|---|
/ | 根目录,Linux 文件系统的起点,所有路径均从它开始 |
/bin | 存放系统最基本的用户命令(如ls、cp),普通用户也可执行 |
/boot | 存放系统内核与启动引导文件 |
/dev | 设备文件目录,Linux 中硬件设备以文件形式呈现于此 |
/etc | 系统与软件的配置文件集中地 |
/home | 普通用户的主目录,一般以用户名命名 |
/lib | 系统运行所需的基础共享库 |
/mnt | 临时挂载点,用于挂载外部存储 |
/opt | 可选软件安装目录 |
/root | root 用户的主目录 |
/tmp | 临时文件目录 |
/usr | 用户安装的程序与文件,类似 Windows 的 Program Files |
/var | 存放经常变化的文件,如日志(/var/log)、缓存、邮件 |
1.2. Linux 文件属性
Linux 系统是典型的多用户系统,不同用户处于不同的地位、拥有不同的权限。为了保护系统安全,Linux 对不同的用户访问同一文件(包括目录文件)的权限做了不同规定。
使用ll或ls -l可以显示一个文件的属性以及文件所属的用户和组:
$ ls -l total 64 drwxr-xr-x 2 root root 4096 Dec 14 2012 bin dr-xr-xr-x 4 root root 4096 Apr 19 2012 boot实例中,bin文件的第一个属性用d表示,d在 Linux 中代表该文件是一个目录文件。Linux 中第一个字符代表这个文件是目录、文件或链接文件等:
- 当为
d则是目录; - 当为
-则是文件; - 若是
l则表示为链接文档(link file); - 若是
b则表示为装置文件里面可供储存的接口设备(可随机存取装置),如硬盘; - 若是
c则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
接下来的字符以三个为一组,均为rwx三个参数的组合。其中r代表可读(read)、w代表可写(write)、x代表可执行(execute)。这三个权限的位置不会改变,如果没有权限,就会出现减号-。
每个文件的属性由左边第一部分的 10 个字符确定,从左至右用 0-9 数字来表示:
- 第 0 位确定文件类型;
- 第 1-3 位确定属主(该文件的拥有者)拥有该文件的权限;
- 第 4-6 位确定属组(拥有者的同组用户)拥有该文件的权限;
- 第 7-9 位确定其他用户拥有该文件的权限;
- 第 1、4、7 位表示读权限,用
r表示有读权限,用-表示无读权限; - 第 2、5、8 位表示写权限,用
w表示有写权限,用-表示无写权限; - 第 3、6、9 位表示可执行权限,用
x表示有执行权限,用-表示无执行权限。
可以对照下面的示意图快速拆解ls -l输出:
-rw-r--r-- 1 user staff 651 Oct 12 12:53 .gitmodules # ↑╰┬╯╰┬╯╰┬╯ # ┆ ┆ ┆ ╰┈ 0 其他人 # ┆ ┆ ╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ g 属组 # ┆ ╰┈┈┈┈ u 属主 # ╰┈┈ 第一个字母 `d` 代表目录,`-` 代表普通文件1.2.1. Linux 文件属主和属组
$ ls -l total 64 drwxr-xr-x 2 root root 4096 Dec 14 2012 bin dr-xr-xr-x 4 root root 4096 Apr 19 2012 boot- 对于文件来说,它都有一个特定的拥有者,也就是对该文件具有所有权的用户;
- 同时,在 Linux 系统中,用户是按组分类的,一个用户属于一个或多个组;
- 文件拥有者以外的用户又可以分为文件拥有者的同组用户和其他用户;
- 因此,Linux 系统按文件拥有者、文件拥有者同组用户和其他用户来规定了不同的文件访问权限。
在以上实例中,bin文件是一个目录文件,属主和属组都为root。属主有可读、可写、可执行的权限;与属主同组的其他用户有可读和可执行的权限;其他用户也有可读和可执行的权限。
权限位与数字的对应关系是后续
chmod 764写法的基石:r=4、w=2、x=1。例如rwx对应4+2+1=7,rw-对应4+2=6,r--对应4。相关权限模型、属主属组概念,可进一步阅读 docs/linux/cli/linux-cli-user.md 中的用户管理命令。
2. Linux 文件目录管理要点
文件目录管理命令可分为三类:目录管理、文件管理与通用管理,先建立整体地图,再逐个击破。
2.1. 目录管理
- 切换目录 —— 使用
cd; - 查看目录信息 —— 使用
ls; - 显示当前目录的绝对路径 —— 使用
pwd; - 树状显示目录的内容 —— 使用
tree; - 创建目录 —— 使用
mkdir; - 删除目录 —— 使用
rmdir。
2.2. 文件管理
- 创建空文件 —— 使用
touch; - 为文件创建连接 —— 使用
ln; - 批量重命名 —— 使用
rename; - 显示文件的详细信息 —— 使用
stat; - 探测文件类型 —— 使用
file; - 设置文件或目录的权限 —— 使用
chmod; - 设置文件或目录的拥有者或所属群组 —— 使用
chown; - 查找文件或目录 —— 使用
locate; - 在指定目录下查找文件 —— 使用
find; - 查找命令的绝对路径 —— 使用
which; - 查找命令的程序、源代码等相关文件 —— 使用
whereis。
which与whereis的详细用法可参考 docs/linux/cli/linux-cli-help.md(查看 Linux 命令帮助信息)。
2.3. 文件和目录通用管理
- 复制文件或目录 —— 使用
cp; - 复制文件或目录到远程服务器 —— 使用
scp; - 移动文件或目录 —— 使用
mv; - 删除文件或目录 —— 使用
rm。
3. 命令常见用法
3.1. cd —— 切换工作目录
cd命令用来切换工作目录。它是使用频率最高的命令之一:
cd # 切换到用户主目录 cd ~ # 切换到用户主目录 cd - # 切换到上一个工作目录 cd .. # 切换到上级目录 cd ../.. # 切换到上两级目录实战要点:在 Shell 脚本中,cd失败时脚本可能继续执行造成误操作,因此推荐使用cd <dir> || exit 1的写法。仓库中的 codes/shell/文件操作/目录基本操作.sh 正是这样实践:
# 进入目录,如果失败,则退出脚本 cd /home/linux-tutorial/temp || exit 1 # 获取当前目录路径 CURRENT_DIR=$(pwd) echo "当前目录是:${CURRENT_DIR}" # 获取上一级目录路径 PARENT_DIR=$(dirname $(pwd)) echo "父目录是:${PARENT_DIR}" # 获取当前执行脚本名 DIR_NAME=$(basename $0) echo "当前执行脚本名是:${DIR_NAME}"3.2. ls —— 显示目录信息
ls命令用来显示目录信息:
ls # 列出当前目录可见文件 ls -l # 列出当前目录可见文件详细信息 ls -la # 列出所有文件(包括隐藏)的详细信息 ls -lh # 列出详细信息并以可读大小显示文件大小 ls -lt # 按时间列出文件和文件夹详细信息 ls -ltr # 按修改时间列出文件和文件夹详细信息 ls --color=auto # 列出文件并标记颜色分类参数速查:
| 选项 | 含义 |
|---|---|
-l | 长格式输出,展示权限、属主、属组、大小、修改时间 |
-a | 显示所有文件,包括以.开头的隐藏文件 |
-h | 与-l搭配,以 K/M/G 等单位显示人类可读的大小 |
-t | 按修改时间排序(最新的在前) |
-r | 逆序排序,与-t组合为-ltr可按时间从旧到新查看 |
--color=auto | 按文件类型着色(目录、普通文件、链接、可执行文件颜色不同) |
ls -l输出的第二列数字是硬链接数(目录则代表其子目录数),例如第 1.2 节示例中bin的2表示该目录包含 2 个子目录项(.与..)。
3.3. pwd —— 显示当前工作目录绝对路径
pwd命令用来显示当前目录的绝对路径,常用于脚本中确定"我当前在哪":
$ pwd /data/web/disk1/git_repo/GitHub_Trending/lin/linux-tutorial3.4. mkdir —— 创建目录
mkdir命令用来创建目录:
# 在当前目录中创建 zp 和 zp 的子目录 test(-p 递归创建,目录已存在时也不会报错) mkdir -p zp/test # 在当前目录中创建 zp 和 zp 的子目录 test;权限设置为文件主可读、写、执行,同组用户可读和执行,其他用户无权访问 mkdir -p -m 750 zp/test参数说明:
-p:递归创建父目录。mkdir -p a/b/c会一次性创建a、a/b、a/b/c三级目录,且目录已存在时不报错,这是脚本中创建目录的标准姿势;-m:创建时直接指定权限模式,750即属主rwx、属组r-x、其他用户无权限(对应数字法7=rwx、5=r-x、0=---)。
3.5. rmdir —— 删除空目录
rmdir命令用来删除空目录:
# 删除子目录 test 和其父目录 zp(-p 表示连同空的父目录一并删除) rmdir -p zp/test注意:rmdir只能删除空目录,目录中若还有文件或子目录会报错。非空目录的删除需要借助rm -r(见 3.19 节)。-p选项递归删除时,若父目录同样为空会一并删除。
3.6. tree —— 树状显示目录结构
tree命令以树状显示目录的内容,是了解项目结构的利器(部分发行版需先安装:yum install -y tree,参见仓库脚本 codes/linux/sys/install-tools.sh):
# 列出目录 /private 第一级文件名 tree /private -L 1 /private/ ├── etc ├── tftpboot ├── tmp └── var # 忽略文件夹 tree -I node_modules # 忽略当前目录文件夹 node_modules tree -P node_modules # 列出当前目录文件夹 node_modules 的目录结构 tree -P node_modules -L 2 # 显示目录 node_modules 两层的目录树结构 tree -L 2 > /home/www/tree.txt # 当前目录结果存到 tree.txt 文件中 # 忽略多个文件夹 tree -I 'node_modules|icon|font' -L 2参数说明:
-L <level>:限制显示的目录层级深度;-I <pattern>:忽略匹配模式的文件或目录(支持|分隔多个模式);-P <pattern>:只列出匹配模式的文件/目录;- 配合
>重定向可将目录树导出到文件,例如tree -L 2 > tree.txt,便于文档归档。
3.7. touch —— 更新时间戳或创建空文件
touch命令有两个功能:一是把已存在文件的时间标签更新为系统当前时间(默认方式),文件数据原封不动保留;二是用来创建空文件。
touch ex2 # 若 ex2 不存在则创建空文件;若已存在则仅更新其访问/修改时间典型场景:
- 快速创建空文件,作为占位符或初始化文件;
- 批量创建测试文件:
touch test{1..10}.log会生成test1.log到test10.log; - 调整文件时间戳后配合
find -newer做增量备份判断。
3.8. ln —— 创建链接
ln命令用来为文件创建连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。如果要创建符号连接必须使用-s选项。
# 将目录 /usr/mengqc/mub1 下的文件 m2.c 链接到目录 /usr/liu 下的文件 a2.c(硬链接) cd /usr/mengqc ln /mub1/m2.c /usr/liu/a2.c # 在目录 /usr/liu 下建立一个符号链接文件 abc,使它指向目录 /usr/mengqc/mub1 # 执行该命令后,/usr/mengqc/mub1 代表的路径将存放在名为 /usr/liu/abc 的文件中 ln -s /usr/mengqc/mub1 /usr/liu/abc硬链接与符号链接的区别:
| 特性 | 硬链接 | 符号链接(软链接,-s) |
|---|---|---|
| inode | 与源文件相同(同一 inode,多一个目录项) | 独立 inode,内容为源文件路径 |
| 源文件删除后 | 链接仍有效,数据仍可访问 | 链接失效(悬空链接) |
| 可否跨文件系统 | 不可以 | 可以 |
| 可否链接目录 | 不可以 | 可以 |
| 权限属性 | 与源文件共享 | 独立属性,但实际读写走源文件 |
🔔 注意:符号链接文件不是一个独立的文件,它的许多属性依赖于源文件,所以给符号链接文件设置存取权限是没有意义的(
chmod作用于符号链接时,改变会作用在被链接的原始文件上)。
3.9. rename —— 批量重命名
rename命令用字符串替换的方式批量重命名(注意:其语法在不同发行版间有差异,以下为常见的 Perl 版本用法):
# 将 main1.c 重命名为 main.c(老式"源串 目标串 文件"语法) rename main1.c main.c main1.c rename "s/AA/aa/" * # 把文件名中的 AA 替换成 aa rename "s//.html//.php/" * # 把 .html 后缀的改成 .php 后缀 rename "s/$//.txt/" * # 把所有的文件名都以 txt 结尾 rename "s//.txt//" * # 把所有以 .txt 结尾的文件名的.txt 删掉rename的 Perl 版本支持正则表达式替换:s/查找/替换/,其中*表示当前目录下所有文件。批量替换示例:
- 批量加前缀:
rename 's/^/backup_/' *.log - 大小写转换:
rename 'y/a-z/A-Z/' *.txt
3.10. stat —— 显示文件状态信息
stat命令用于显示文件的状态信息,其输出比ls -l更详细,包含 inode、文件大小、块数、访问/修改/变更时间等:
stat myfile典型的stat输出包含:
File:文件名与路径;Size/Blocks:文件字节数与占用的块数;Access/Modify/Change:访问时间(atime)、修改时间(mtime)、状态变更时间(ctime)及对应的时间戳;Access(权限行):数字与符号两种权限表示;UID/GID:属主与属组的用户 ID 与名称;Links:硬链接数;Inode/Device:inode 号与所在设备。
stat常用于排查文件是否被修改(对比 mtime/ctime)以及确认 inode 号是否变化(判断是否为同一文件)。
3.11. file —— 探测文件类型
file命令用来探测给定文件的类型。file对文件的检查分为文件系统检查、魔法幻数(magic number)检查和语言检查 3 个过程:
file install.log # 显示文件类型 file -b install.log # 不显示文件名称(brief 模式) file -i install.log # 显示 MIME 类型 file -L /var/spool/mail # 显示符号链接指向的目标文件的类型(follow 链接)参数说明:-b只输出类型描述、不显示文件名,便于在脚本中提取类型字符串;-i输出text/plain、application/gzip等 MIME 类型,常用于 Web 服务与脚本判断;-L对符号链接追踪到源文件。
3.12. chmod —— 变更文件或目录权限
chmod命令用来变更文件或目录的权限。在 UNIX 系统家族里,文件或目录权限的控制分别以读取、写入、执行 3 种一般权限来区分,另有 3 种特殊权限可供运用。设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。
知识扩展:Linux 用户分为拥有者、组群(Group)、其他(other)。系统中所有帐号与一般身份使用者以及 root 的相关信息记录在/etc/passwd文件中,每个人的密码记录在/etc/shadow文件下,所有的组群名称记录在/etc/group内。
数字法权限值:
例:rwx rw- r-- r=读取属性 //值=4 w=写入属性 //值=2 x=执行属性 //值=1即每三位一组求和:rwx = 4+2+1 = 7、rw- = 4+2 = 6、r-- = 4。例如chmod 764表示属主rwx、属组rw-、其他用户r--。
示例:
chmod u+x,g+w f01 # 为文件 f01 设置自己可以执行,组员可以写入的权限 chmod u=rwx,g=rw,o=r f01 chmod 764 f01 chmod a+x f01 # 对文件 f01 的 u,g,o 都设置可执行属性 # 将 /home/wwwroot/ 里的所有文件和文件夹设置为 755 权限 chmod -R 755 /home/wwwroot/*符号法速查:
| 符号 | 含义 |
|---|---|
u | 属主(user) |
g | 属组(group) |
o | 其他用户(other) |
a | 全部(all),即 u+g+o |
+/-/= | 增加 / 移除 / 精确设置权限 |
r/w/x | 读 / 写 / 执行 |
-R:递归修改目录及其下所有文件与子目录的权限,部署 Web 站点时chmod -R 755 /home/wwwroot/*是常见操作。
特殊权限位(延伸了解):setuid(u+s,数字位 4)、setgid(g+s,数字位 2)与粘滞位(o+t,数字位 1),分别用于提升执行身份、继承组身份以及限制目录内文件删除(如/tmp)。例如chmod 4755即 setuid 权限。
3.13. chown —— 变更文件或目录的所有者与属组
chown命令改变某个文件或目录的所有者和所属的组,可以向某个用户授权,使该用户变成指定文件的所有者或改变文件所属的组。用户可以是用户名或用户 ID,用户组可以是组名或组 ID。文件名可以是空格分开的文件列表,文件名中可以包含通配符。
只有文件拥有者和超级用户(root)才可以使用该命令。
# 将目录 /usr/meng 及其下面的所有文件、子目录的文件主改成 liu chown -R liu /usr/meng扩展用法:
chown liu:staff file.txt # 同时修改属主为 liu、属组为 staff chown :staff file.txt # 仅修改属组 chown -R liu /usr/meng # 递归修改目录下所有内容3.14. locate —— 快速查找文件
locate命令(以及slocate)用来查找文件或目录。locate命令其实是find -name的另一种写法,但比后者快得多,原因在于它不搜索具体目录,而是搜索数据库/var/lib/locatedb(部分发行版为/var/lib/mlocate/mlocate.db),这个数据库含有本地所有文件信息。Linux 系统自动创建这个数据库,并且每天自动更新一次,所以使用locate查不到最新变动过的文件。为避免这种情况,可以在使用locate之前先用updatedb命令手动更新数据库。
locate pwd # 查找和 pwd 相关的所有文件 locate /etc/sh # 搜索 etc 目录下所有以 sh 开头的文件要点:locate基于预先构建的索引数据库,速度远快于find的全盘遍历,但存在延迟;新增文件后需updatedb刷新索引。
3.15. find —— 在指定目录下查找文件
find命令用来在指定目录下查找文件。任何位于参数之前的字符串都被视为欲查找的目录名。如果使用该命令时不设置任何参数,则find命令将在当前目录下查找子目录与文件,并将查找到的子目录和文件全部显示。
# 当前目录搜索所有文件,文件内容包含 "140.206.111.111" 的内容(find 找出文件,xargs 把文件名作为 grep 参数) find . -type f -name "*" | xargs grep "140.206.111.111" # 列出当前目录及子目录下所有文件和文件夹 find . # 在 /home 目录下查找以 .txt 结尾的文件名 find /home -name "*.txt" # 同上,但忽略大小写 find /home -iname "*.txt" # 当前目录及子目录下查找所有以 .txt 和 .pdf 结尾的文件 find . -name "*.txt" -o -name "*.pdf" # 匹配文件路径或者文件 find /usr/ -path "*local*" # 基于正则表达式匹配文件路径 find . -regex ".*\(\.txt\|\.pdf\)$" # 同上,但忽略大小写 find . -iregex ".*\(\.txt\|\.pdf\)$" # 找出 /home 下不是以 .txt 结尾的文件 find /home ! -name "*.txt"常用表达式速查:
| 表达式 | 含义 |
|---|---|
-name/-iname | 按文件名匹配(iname忽略大小写),支持*、?通配符 |
-type f/d/l | 按类型过滤:普通文件 / 目录 / 链接 |
-o | 逻辑或,组合多个条件(如上例.txt或.pdf) |
! | 逻辑非,取反匹配 |
-path | 匹配完整路径(含目录层级) |
-regex/-iregex | 按正则表达式匹配路径,注意转义\(、\| |
-exec ... {} \; | 对每个匹配结果执行命令,如find . -name "*.log" -exec rm -f {} \; |
进阶组合:
# 按修改时间查找:查找 7 天内修改过的文件 find /data -mtime -7 -type f # 按大小查找:大于 100M 的文件 find /var -size +100M # 找到后批量执行命令(删除旧日志) find /var/log -name "*.log" -mtime +30 -exec rm -f {} \;注意:上例
find -name "*"会匹配所有文件,再配合xargs grep实现"全文内容检索"。生产环境中更推荐限定-name或-type范围以提升效率。
3.16. cp —— 复制文件或目录
cp命令将一个或多个源文件或目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体文件或复制到一个已存在的目录下。cp还支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误。
参数:
- 源文件:指定源文件列表。默认情况下
cp命令不能复制目录,如果要复制目录,则必须使用-R选项; - 目标文件:指定目标文件。当"源文件"为多个文件时,要求"目标文件"为指定的目录。
示例:
# 将文件 file 复制到目录 /usr/men/tmp 下,并改名为 file1 cp file /usr/men/tmp/file1 # 将目录 /usr/men 下的所有文件及其子目录复制到目录 /usr/zh 中 cp -r /usr/men /usr/zh # 强行将 /usr/men 下的所有文件复制到目录 /usr/zh 中,无论是否有文件重复 cp -rf /usr/men/* /usr/zh # 将目录 /usr/men 中以 m 打头的所有 .c 文件复制到目录 /usr/zh 中 cp -i /usr/men m*.c /usr/zh常用选项:
| 选项 | 含义 |
|---|---|
-r/-R | 递归复制目录及其内容 |
-f | 强制复制,覆盖目标文件时不提示 |
-i | 交互式覆盖确认,防止误覆盖 |
-p | 保留原文件的权限、属主、时间戳等属性 |
-a | 归档模式,相当于-dpR,常用于备份 |
-v | 显示复制过程 |
3.17. scp —— 跨服务器远程拷贝
scp命令用于在 Linux 下进行远程拷贝文件,与cp类似,但cp只能在本机拷贝、不能跨服务器,而scp传输是加密的,可能会稍微影响速度。当服务器硬盘变为只读(read only system)时,用scp可以把文件移出来。另外,scp非常不占资源,不会提高多少系统负荷——在这一点上rsync就远远不及它:虽然rsync比scp快一点,但当小文件众多时rsync会导致硬盘 I/O 非常高,而scp基本不影响系统正常使用。
# 拷贝文件到远程服务器的指定目录 scp <file> <user>@<ip>:<url> scp test.txt root@192.168.0.1:/opt # 拷贝目录到远程服务器的指定目录 scp -r <folder> <user>@<ip>:<url> scp -r test root@192.168.0.1:/opt常用选项:-r递归复制目录;-P <port>指定 SSH 端口(注意是大写 P);-C启用压缩传输。
3.17.1. scp 免密码传输
(1)生成 SSH 公私钥对:
ssh-keygen -t rsa(2)将服务器 A 的~/.ssh/id_rsa.pub文件内容复制到服务器 B 的~/.ssh/authorized_keys文件中:
# 服务器 A 上执行以下命令 scp ~/.ssh/id_rsa.pub root@192.168.0.2:~/.ssh/id_rsa.pub.tmp # 服务器 B 上执行以下命令 cat ~/.ssh/id_rsa.pub.tmp >> ~/.ssh/authorized_keys rm ~/.ssh/id_rsa.pub.tmp配置完成后,从 A 到 B 的scp/ssh将不再需要输入密码,可安全用于脚本与定时任务。免密传输相关的补充用法可参考 codes/shell/输入和输出/免密码传输.sh。
3.18. mv —— 移动或重命名文件
mv命令对文件或目录重新命名,或将文件从一个目录移到另一个目录中。source表示源文件或目录,target表示目标文件或目录。如果将一个文件移到一个已经存在的目标文件中,则目标文件的内容将被覆盖。
mv file1.txt /home/office/ # 移动单个文件 mv file2.txt file3.txt file4.txt /home/office/ # 移动多个文件 mv *.txt /home/office/ # 移动所有 txt 文件 mv dir1/ /home/office/ # 移动目录 mv /usr/men/* . # 将指定目录中的所有文件移到当前目录中 mv file1.txt file2.txt # 重命名文件 mv dir1/ dir2/ # 重命名目录 mv -v *.txt /home/office # 打印移动信息 mv -i file1.txt /home/office # 提示是否覆盖文件 mv -uv *.txt /home/office # 源文件比目标文件新时才执行更新 mv -vn *.txt /home/office # 不要覆盖任何已存在的文件 mv -f *.txt /home/office # 无条件覆盖已经存在的文件 mv -bv *.txt /home/office # 复制时创建备份常用选项:-i覆盖前交互确认;-f强制覆盖不提示;-u仅当源文件更新时才移动(update);-n不覆盖任何已存在文件(no-clobber);-v显示移动详情;-b移动前为目标文件创建备份。
注意
-u与-n语义相反但都用于保护数据,-f、-u、-n同时存在时以最后出现的选项为准。
3.19. rm —— 删除文件或目录
rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉。对于链接文件,只是删除整个链接文件,而原有文件保持不变。
rm test.txt # 删除文件 rm -i test.txt test2.txt # 交互式删除文件 rm -r * # 删除当前目录下的所有文件和目录 rm -r testdir # 删除目录下的所有文件和目录 rm -rf testdir # 强制删除目录下的所有文件和目录 rm -v testdir # 显示当前删除操作的详情常用选项:-i逐个确认;-f强制删除、忽略不存在的文件且不提示;-r/-R递归删除目录;-v显示删除详情。
⚠️高危警告:
rm -rf /、rm -rf ~等命令会不可逆地摧毁数据,执行前务必三思;建议结合-i或先ls确认路径。
3.19.1. 实战:用"回收站"思想改造 rm(仓库源码演示)
rm删除的文件无法恢复,运维中误删是最高频事故之一。仓库中的 codes/linux/tool/Custom_Rm.sh 提供了一个经典的"自定义回收站"方案:把rm别名为移动脚本,删除即移入~/.TRASH_DIR,再通过 crontab 每天定时清理,彻底杜绝误删风险。其核心逻辑如下:
#!/usr/bin/env bash # 功能:自定义 rm 命令,每天晚上定时清理 CMD_SCRIPTS=$HOME/.rm_scripts.sh TRASH_DIR=$HOME/.TRASH_DIR CRON_FILE=/var/spool/cron/root BASHRC=$HOME/.bashrc [ ! -d ${TRASH_DIR} ] && mkdir -p ${TRASH_DIR} # 生成回收站脚本:把"删除"变成"移入回收站并追加时间戳" cat > $CMD_SCRIPTS << EOF PARA_CNT=\$# TRASH_DIR=$TRASH_DIR for i in \$*; do DATE=\$(date +%F%T) fileName=\$(basename \$i) mv \$i \$TRASH_DIR/\$fileName.\$DATE done EOF # 将 alias rm 指向自定义脚本,并加载配置 sed -i "s@$(grep 'alias rm=' $BASHRC)@alias rm='bash ${CMD_SCRIPTS}'@g" $BASHRC source $HOME/.bashrc # 每天零点清空回收站 echo "0 0 * * * rm -rf $TRASH_DIR/*" >> $CRON_FILE echo "删除目录:$TRASH_DIR" echo "删除脚本:$CMD_SCRIPTS" echo "请执行:source $BASHRC 来加载文件或退出当前shell重新登录"原理拆解:脚本用date +%F%T给每个被删文件打上时间戳(如test.txt.2026-09-1600:00:00),再用mv将其移入回收站目录;crontab的0 0 * * *任务在每天零点清空回收站,实现"误删可恢复、磁盘不堆积"的效果。这与 3.18 节mv的"移动"语义、以及 3.19 节rm的"真正删除"语义形成了完整对照。
4. 综合实战:基于仓库脚本的文件目录操作
将上述命令组合到真实脚本中,可以完成复杂的运维任务。仓库中的 codes/shell/文件操作/目录基本操作.sh 演示了"创建 → 进入 → 复制 → 移动 → 删除"的完整目录生命周期:
# 创建目录(整个文件路径中的目录如果不存在,都会一一创建,如果目录已存在,则什么也不做) mkdir -p /home/linux-tutorial/temp # 进入目录,如果失败,则退出脚本 cd /home/linux-tutorial/temp || exit 1 # 复制目录(复制 temp 目录所有内容,并命名新文件夹叫 temp2) cp -rf /home/linux-tutorial/temp /home/linux-tutorial/temp2 # 移动目录(将 temp2 移到 temp 目录下) mv /home/linux-tutorial/temp2 /home/linux-tutorial/temp/temp2 # 删除目录 rm -rf /home/linux-tutorial与之配套的路径解析技巧可参考 codes/shell/文件操作/文件路径操作.sh,用 Shell 参数扩展从路径中提取文件名、后缀、目录等片段:
path=/dir1/dir2/dir3/test.txt echo ${path##*/} # 获取文件名 test.txt echo ${path##*.} # 获取后缀 txt # 不带后缀的文件名 temp=${path##*/} echo ${temp%.*} # test # 获取目录 echo ${path%/*} # /dir1/dir2/dir3磁盘空间管理也是文件目录运维的重要一环。仓库中的 codes/linux/tool/查看指定目录磁盘使用情况.sh 结合du、sort、sed、gawk统计指定目录下占用空间最大的 Top 10:
for DIR in ${DIRS} do echo "The ${DIR} Directory:" du -S ${DIR} 2> /dev/null | sort -rn | sed '{11,$D; =}' | sed 'N; s/\n/ /' | gawk '{printf $1 ":" "\t" $2 "\t" $3 "\n"}' done其思路是:du -S统计各子目录大小(不包含子目录自身大小),sort -rn按数值逆序排序,再经sed/gawk加工成易读的排行输出。与之相关的磁盘命令du/df的更多说明见 docs/linux/cli/linux-cli-hardware.md。
5. 小结与速查
本文以 docs/linux/cli/linux-cli-dir.md 为纲,完整覆盖了 Linux 文件目录管理的核心知识:
- 目录结构:根目录
/出发的树形结构,/etc、/home、/var、/usr等关键目录各司其职; - 属性与权限:
ls -l的 10 位属性串 = 1 位类型位 + 9 位权限位(属主/属组/其他各 3 位),chmod支持符号法与数字法(r=4,w=2,x=1),chown调整属主属组; - 命令矩阵:目录管理(
cd/ls/pwd/mkdir/rmdir/tree)、文件管理(touch/ln/rename/stat/file/chmod/chown/locate/find)、通用管理(cp/scp/mv/rm); - 运维实践:
find | xargs grep全文检索、scp免密传输、mkdir -p与cd || exit 1的脚本安全写法,以及用回收站脚本改造rm的防误删方案。
建议读者在真实服务器上逐一验证以上命令,并结合仓库中的 codes/shell 目录下的脚本(目录操作、文件读取、临时文件管理等)动手实践。关于文件内容查看(cat/head/tail/grep等)与压缩解压(tar/gzip/zip)命令,可继续阅读 docs/linux/cli/linux-cli-file.md 与 docs/linux/cli/linux-cli-file-compress.md,从而构建完整的 Linux 命令行知识体系。
【免费下载链接】linux-tutorial:penguin: Linux教程,主要内容:Linux 命令、Linux 系统运维、软件运维、精选常用Shell脚本项目地址: https://gitcode.com/GitHub_Trending/lin/linux-tutorial
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考