Linux 命令使用案例:文件和目录管理

发布于:2025-08-30 ⋅ 阅读:(24) ⋅ 点赞:(0)

命令行是从左到右解析的,后出现的选项会覆盖前面的。

查看命令A的详细信息man AA --helpA -h
可用&&连接运行多个命令

1️⃣ ls命令:显示目录中文件及其属性信息

语法格式ls [参数] [文件或目录…]

1. 文件信息深度展示

参数 场景 示例 说明
-l (长格式) 查看权限、大小、时间等元数据 ls -l /var/log 显示文件类型、权限、硬链接数、所有者、大小、修改时间
-a (显示隐藏文件) 排查配置文件或隐藏项 ls -a ~ 显示以 . 开头的隐藏文件(如 .bashrc
-h (人性化大小) 直观查看文件大小 ls -lh 将字节转为 K/M/G(如 12K 代替 12288
--full-time 精确时间戳(日志审计) ls -l --full-time 显示完整修改时间(含纳秒)

2. 排序与筛选

参数 场景 示例 说明
-t (按时间排序) 定位最新文件 ls -lt 按修改时间倒序(最新在最前)
-S (按大小排序) 查找大文件 ls -lS 按文件大小倒序(最大在最前)
-r (反向排序) 反向查看结果 ls -ltr 按修改时间正序(最旧在最前)
-X (按扩展名排序) 分类查看文件类型 ls -lX 按文件后缀名分组(如 .sh, .txt

3. 目录与递归

参数 场景 示例 说明
-d (目录本身) 查看目录属性(非内容) ls -ld /tmp 显示 /tmp 目录的权限而非其文件列表
-R (递归列出) 遍历子目录结构 ls -R project/ 递归显示所有子目录中的文件

4. 格式化与脚本友好

参数 场景 示例 说明
-1 (单列输出) 管道处理或脚本解析 ls -1 每行仅显示一个文件名(无其他信息)
-m (逗号分隔) 生成文件列表 ls -m *.txt 输出 file1.txt, file2.txt(逗号分隔)
-Q (引号包裹) 处理含空格文件名 ls -Q 输出 "file with spaces.txt"

总结:黄金组合

场景 推荐命令 作用
日常查看 ls -lht 按时间倒序+人性化大小
空间清理 ls -lSh | head -n 20 列出最大的20个文件
目录检查 ls -ld /path/ 查看目录属性而非内容
脚本处理 ls -1Q *.log 单列输出+引号包裹文件名
完整审计 ls -alR --full-time > audit.txt 递归导出全属性文件清单

组合命令案例

列出指定(/当前)文件夹内的所有文件,ls -lahp 指定文件夹路径

  • l 文件详细信息
  • a 包括... 开头的所有文件,A除了...外的其他所有文件
  • h 可读的文件大小
  • p 目录后带上/区分
  • StS文件大小排序,t 按修改时间排序,同类型的指令,以最后一个为准,即按修改时间排序
  • 指定文件夹路径
    • 不指定则为当前文件夹
    • 绝对路径:/path/ 从根目录开始的路径
    • 相对路径:../ 上层目录,./ 当前目录
    • 通配符路径:/path/P* path文件夹内以P开头的所有文件

结果解析

drwx------@ 140 user staff 4.4K 8 3 11:25 Downloads
解读:

  • 这是一个目录,所有者有全部权限(读、写、执行),组和其他用户没有任何权限。
  • 该目录在macOS上具有扩展属性。
  • 硬链接数为140,所有者是user,所属组是staff,目录元数据大小为4.4KB,最后修改时间是8月3日11:25,目录名为Downloads。

属性解析:

  • 第1位:文件类型d 目录,- 普通文件
  • 第2-10位:rwx------ -> 用户、组、其他的权限r 可读权限,w 可写权限, x 可执行权限,- 无权限
    • 权限的数字表示:r 为 4,w 为2, x为1,- 为0,举例:rwx=4+2+1=7,rwx------为700
  • 第11位:@ -> 表示文件带有扩展属性(仅macOS,在Linux中可能用+表示ACL或其他)
  • 140 表示该目录下的子目录项(包括...)的数量
  • user 表示文件所有者
  • staff 表示文件所属组
  • 4.4K 表示文件大小(通常只是目录元数据的大小,不是目录内容的总大小)
  • 8 3 11:25:最后修改的日期和时间(8月3日11:25)。年份没有显示,可能是因为在一年内。
  • Downloads:文件或目录名

2️⃣ mkdir命令 – 创建目录文件

语法格式 : mkdir 参数 目录名

参数 适用场景 示例命令 说明
-p (递归创建) 创建多级嵌套目录(父目录不存在时自动创建) mkdir -p project/src/utils 自动创建 projectsrcutils 三级目录,避免逐层创建。
-m (权限设置) 创建时指定目录权限(跳过 umask 限制) mkdir -m 770 secure_dir 直接设置权限为 rwxrwx---,适用于敏感目录(如仅组用户可访问)。
-v (显示详情) 脚本调试或需确认创建结果时 mkdir -v backup/logs 输出 已创建目录 'backup/logs',明确操作结果。
{} 通配符 批量创建有规律的目录结构 mkdir -p data/{mysql3306,mysql3308}/{logs,data,tmp} 一次性生成多实例 MySQL 的数据目录结构。

3️⃣ cd命令 – 切换目录

语法格式cd 参数 目录名

命令/符号 功能描述 使用场景
cdcd ~ 返回当前用户的家目录 快速回到个人工作空间
cd - 返回上一个工作目录 在两个目录间快速切换
cd .. 进入上级目录 导航到父目录
cd ../.. 进入上两级目录 多级回退
cd / 进入根目录 系统级文件操作
. (点) 当前目录 常用于路径组合(如 cd ./subdir
~username 进入指定用户的家目录 访问其他用户的文件(需权限)
cd -- 终止选项解析 切换以 - 开头的目录(如 cd -- -tmp

4️⃣ pushd 和 popd 命令 - 切换目录

pushdpopd 是 Linux 中管理目录栈的强大工具,特别适合在多个目录间高效切换。

一、核心命令功能

命令 功能 目录栈变化
pushd [目录] 将目录压入栈顶并切换到该目录 栈大小增加
pushd (无参数) 交换栈顶前两个目录 栈大小不变
popd 弹出栈顶目录并切换到新栈顶 栈大小减少
dirs 显示目录栈内容 无变化

二、参数详解与使用场景

1. pushd 参数
参数 功能 场景
+n 旋转栈,使第n个目录成为栈顶 pushd +2 → 将索引2的目录移到栈顶
-n 从栈底开始计数旋转 pushd -0 → 将栈底目录移到栈顶
-n [目录] 添加目录但不切换(仅压栈) 预加载目录到栈中备用
2. popd 参数
参数 功能 场景
+n 移除栈中第n个目录 popd +1 → 移除索引1的目录
-n 从栈底开始计数移除 popd -0 → 移除栈底目录
-n (无数字) 移除时不切换目录 清理栈中无用目录
3. dirs 查看参数
参数 功能 示例输出
-v 带索引号纵向显示 0 ~/project 1 /var/log
-p 纵向显示无索引号 ~/project
/var/log
-l 显示完整路径 /home/user/project
-c 清空目录栈 只保留当前目录

5️⃣ mv命令 – 移动或改名文件

语法格式mv 参数 源文件名 目标文件名

组合命令案例

移动当前目录下的a.txt文件到当前目录dir01文件夹下,若提供文件名则重命名:mv -bfuv a.txt dir01/b.txt

  • b 覆盖时创建一个备份文件,比如 a.txt~
  • f 强制覆盖不询问是否确认,i 为询问,n为不覆盖已有文件
  • u 源文件比目标文件更新时,才覆盖
  • v 显示执行过程详细信息,显示:'a.txt' -> 'dir01/b.txt'

6️⃣ pwd命令 – 显示当前工作目录的路径

语法格式pwd 参数

参数 全称/含义 使用场景 示例命令 输出示例
-L --logical (逻辑路径) 显示包含符号链接的路径(默认行为)
适用于日常操作,保持用户看到的路径一致性
pwd -L /var/www (若 /var/www 是符号链接)
-P --physical (物理路径) 解析所有符号链接,显示真实物理路径
脚本开发、路径校验等需要绝对真实路径的场景
pwd -P /mnt/disk1/webroot (符号链接指向的实际位置)
(无参数) - 默认行为等同于 -L pwd /home/user/docs

7️⃣ cp命令 – 复制文件或目录

语法格式cp 参数 源文件名 目标文件名

参数 全称/含义 主要使用场景
-i --interactive (交互式) 覆盖前询问确认。防止意外覆盖重要文件。适合日常操作,尤其是目标位置可能已存在同名文件时。
-n --no-clobber (不覆盖) 禁止覆盖已存在文件。目标文件存在时,跳过不复制也不提示。适合脚本中确保安全复制。
-u --update (更新) 仅当源文件比目标文件新,或目标不存在时才复制。常用于增量备份或同步更新文件。
-v --verbose (详细输出) 显示复制过程的详细信息(如复制了哪些文件)。用于需要跟踪操作结果的场景。
-r / -R --recursive (递归) 递归复制目录及其内容。复制文件夹时必须使用此参数。
-a --archive (归档模式) 保留所有文件属性(权限、时间戳、所有者等)并递归复制。等同于 -dR --preserve=all备份或完整迁移目录时首选
-p --preserve (保留属性) 保留文件属性(权限、时间戳等)。可与 -a 替换,但 -a 更常用。
-s --symbolic-link (符号链接) 创建符号链接而非复制文件内容。节省空间,链接到源文件。
-l --link (硬链接) 创建硬链接而非复制内容。节省空间,与原文件共享 inode。
-t <目录> --target-directory=<目录> 指定目标目录。适用于一次复制多个文件到同一目录,语法更清晰。

组合命令案例

  • cp -auv source/ backup/ 保留属性 + 增量更新 + 详细输出
  • cp -rv source/ backup/ 递归复制 + 详细输出

硬链接 -l VS 符号链接 -s

特性 硬链接 (Hard Link) 符号链接 (Symbolic Link)
本质 指向文件数据的直接指针 指向文件路径的快捷方式
文件系统限制 只能在同一文件系统内创建 可跨不同文件系统创建
原始文件删除后 链接文件仍可访问(数据未删除) 链接文件失效(悬空链接)
inode 号 与原始文件 相同 与原始文件 不同
目录支持 ❌ 不能链接到目录 ✅ 可以链接到目录
文件类型 普通文件(无特殊标记) 特殊文件(l 类型,权限为 rwxrwxrwx
查看内容 cat link 显示原始文件内容 cat link 显示原始文件内容

-s 符号链接文件 a_cp.txt
-l 硬链接文件 a_hard_link.txt

-rw-r--r--  2 user  wheel     7B  8 16 13:40 a.txt
lrwxr-xr-x  1 user  wheel     5B  8 16 13:44 a_cp.txt -> a.txt
-rw-r--r--  2 user  wheel     7B  8 16 13:40 a_hard_link.txt

8️⃣ ln 创建文件的链接

作用:创建文件的链接(快捷方式),分为 硬链接(Hard Link)符号链接(Symbolic Link)

# 创建硬链接(默认)
ln 源文件 链接名

# 创建符号链接(-s 参数)
ln -s 源文件 链接名
特性 硬链接 符号链接
存储内容 指向源文件的 inode 存储源文件的路径字符串
跨文件系统 ❌ 不支持 ✅ 支持
链接到目录 ❌ 禁止(系统限制) ✅ 支持
源文件删除后 仍可访问(数据未删除) ❌ 链接失效(“断链”)
磁盘空间占用 极小(仅新增目录项) 极小(仅存路径)
文件属性同步 修改任意链接,所有链接同步 修改链接文件不影响源文件
查看命令 ls -i(inode 相同) ls -l(显示箭头 ->

ln 链接 vs cp 复制

维度 ln (链接) cp (复制)
磁盘空间 几乎不占用额外空间 占用与源文件相同的空间
数据同步 所有链接指向同一数据(实时同步) 副本独立(与源文件隔离)
跨文件系统 仅符号链接支持 完全支持
目录支持 仅符号链接支持目录 完全支持(需递归)
源文件删除 硬链接仍有效,符号链接失效 副本不受影响
适用场景 节省空间 + 多入口同步 备份隔离 + 数据迁移

⚠️注意:使用cp -rs 创建文件夹的符号链接时,需要注意文件路径,否则很可能路径错误导致创建成功而文件无法读取。比如:当源目录和目标目录不在同一层级时,创建的符号链接会指向错误的相对路径。推荐使用绝对路径,但这种场景最好是使用ln。而且cp -rs对文件夹的操作仅限当前的所有文件,后续新增不会同步,但 ln 可以同步

总结

  • ln:创建文件引用,核心价值是 节省空间 + 实时同步,适合:
    → 多入口访问同一数据(硬链接)
    → 目录快捷方式/跨分区(符号链接)
  • cp:创建数据副本,核心价值是 隔离性 + 备份,适合:
    → 数据备份、迁移、修改测试
    → 需要文件完全独立的场景

📌 牢记原则

  • 同步修改 → 用 ln
  • 独立副本 → 用 cp
  • 硬链接是 同一文件的多个名字,符号链接是 指向路径的快捷方式

9️⃣ tar命令 – 压缩和解压缩文件

tar 是 Linux 中用于文件归档的核心工具,支持多种压缩格式和高级操作。

📦 一、核心操作模式(必选其一)

参数 全称 场景 示例
-c --create 创建新归档(备份/打包) tar -cvf backup.tar /data
-x --extract 解压归档(恢复文件) tar -xvf backup.tar
-t --list 查看内容(不解压) tar -tvf backup.tar
-r --append 追加文件(已存在归档) tar -rvf backup.tar newfile.txt
-u --update 更新文件(仅添加新版本) tar -uvf backup.tar modified.txt

🗜️ 二、压缩格式选项(按需选择)

参数 压缩类型 扩展名 适用场景
-z gzip .tar.gz 通用压缩(平衡速度/压缩率)
-j bzip2 .tar.bz2 更高压缩率(CPU资源充足)
-J xz .tar.xz 极致压缩(大文件归档)
--zstd Zstandard .tar.zst 高速压缩(现代系统首选)
无压缩 - .tar 临时归档或后续管道处理

💡 注:Linux 新版 tar 支持自动检测压缩类型,解压时可不指定压缩参数


⚙️ 三、关键辅助参数

参数 场景 示例
-v 显示详细过程 tar -cvf
-f 指定归档文件名(必须最后出现 tar -cf archive.tar dir/
-C 解压到指定目录 tar -xvf backup.tar -C /restore/
--exclude 排除文件/目录 tar -czvf backup.tar.gz --exclude='*.tmp' /data
-h 跟随符号链接(复制实际文件) tar -chvf backup.tar /opt
-p 保留文件权限 tar -cpzvf etc_backup.tar.gz /etc
--wildcards 通配符匹配 tar -tvf backup.tar --wildcards '*.log'

💎 四、场景速查表

需求 推荐命令
日常快速压缩 tar -czvf name.tar.gz dir
最大压缩率 tar -cJvf name.tar.xz dir
查看内容 tar -tvf archive.tar
解压到目录 tar -xvf archive.tar -C /target
增量更新 tar -uvzf archive.tar.gz dir
备份排除文件 tar -czvf backup.tar.gz --exclude='*.tmp' dir
网络传输 tar -czf - dir | ssh user@host "tar -xzf - -C /target"
权限保留 tar -cpzvf backup.tar.gz dir

📌 黄金法则

  • 创建归档:-c[v] + 压缩选项 + -f 文件名
  • 解压归档:-x[v] + 压缩选项 + -f 文件名 + [-C 目录]
  • 关键操作总是保留 -v 直到命令调试完成

🔟 find命令 - 文件搜索

格式通常为:find [路径...] [表达式]

1. 指定搜索路径和深度
参数 场景描述 示例
. 在当前目录及其所有子目录中搜索 find . -name "*.txt"
/home 在指定目录及其所有子目录中搜索 find /home -name "*.conf"
-maxdepth N 限制搜索的最大深度(常用于避免搜索过深) find /var -maxdepth 2 -name "*.log"
-mindepth N 设置开始搜索的最小深度(常用于跳过顶层文件) find . -mindepth 2 -name "*.tmp"
2. 按文件名搜索(最常用)
参数 场景描述 示例
-name "模式" 按基础文件名搜索(区分大小写) find . -name "report.pdf"
-iname "模式" 按基础文件名搜索(不区分大小写) find . -iname "report*"(匹配 Report.txt, REPORT.pdf)
-path "模式" 按完整路径名搜索(区分大小写) find /usr -path "*/share/*"
-ipath "模式" 按完整路径名搜索(不区分大小写) find . -ipath "*test*"
-regex "模式" 使用正则表达式匹配完整路径(更强大,更复杂) find . -regex ".*/backup-202[0-9]*\.tar\.gz"
3. 按文件类型搜索
参数 文件类型 场景描述
-type f 普通文件 搜索文档、图片、日志等
-type d 目录 搜索目录
-type l 符号链接 搜索软链接文件
-type s Socket 文件 系统管理
-type p 命名管道 (FIFO) 系统管理
-type b 块设备 系统管理(如磁盘)
-type c 字符设备 系统管理(如终端)

示例find /dev -type b (查找所有块设备)

4. 按时间过滤(日志清理、查找新文件神器)
参数 时间单位 场景描述(查找在 N 时间单位被访问/修改/状态变更的文件)
-atime N 天 (24h) 查找 N 天内被访问过的文件。+7 表示超过7天,-7 表示7天内
-mtime N 天 (24h) 查找 N 天内被修改过内容的文件(最常用)
-ctime N 天 (24h) 查找 N 天内状态被改变的文件(如权限、所有者)
-amin N 分钟 查找 N 分钟内被访问过的文件
-mmin N 分钟 查找 N 分钟内被修改过的文件(非常实用)
-cmin N 分钟 查找 N 分钟内状态被改变的文件

示例

  • find /var/log -mtime +30 -name "*.log" (查找30天前修改过的日志文件,用于清理)
  • find /home -mmin -5 (查找5分钟内被修改过的文件,用于排查问题)
5. 按文件大小过滤
参数 场景描述 示例
-size N[cwbkMG] 查找大小为 N 个单位的文件。+N 表示大于,-N 表示小于 find . -size +100M (查找大于100MB的文件)
-empty 查找空文件或空目录 find /tmp -empty (清理空文件)

单位解释c(字节), k(KB, 1024字节), M(MB), G(GB)。默认单位是 b(512字节块),建议总是明确指定单位(如 M)。

6. 按权限和用户/组过滤
参数 场景描述 示例
-perm 644 精确匹配权限为644的文件 find . -perm 644
-perm -644 包含这些权限位(文件权限至少包含644) find . -perm -u=rw (用户至少拥有rw权限)
-perm /644 任意权限位匹配(文件权限包含任意rwx中的任何一个) find . -perm /o+w (其他人有写权限,查找危险文件)
-user username 查找属于特定用户的文件 find /home -user alice
-group groupname 查找属于特定用户组的文件 find /var -group www-data
-nouser 查找不属于任何有效用户的文件(用于清理) find / -nouser 2>/dev/null
丢弃错误信息2 代表标准错误输出 (stderr)。/dev/null 是一个特殊的“黑洞”设备,任何写入它的数据都会被丢弃)
-nogroup 查找不属于任何有效用户组的文件 find / -nogroup 2>/dev/null
7. 逻辑操作符(组合条件)
参数 场景描述 示例
-a-and (默认操作符,可省略) find . -name "*.txt" -type f
-o-or find . -name "*.jpg" -o -name "*.png"
!-not find . ! -name "*.tmp" (排除tmp文件)
(...) 分组(需用反斜杠转义,或加引号) find . \( -name "*.c" -o -name "*.h" \) -type f
8. 对找到的文件执行操作(-exec 是核心!)
参数 场景描述 示例
-exec command {} \; 执行命令{} 是找到文件的占位符,\; 表示命令结束 find . -name "*.tmp" -exec rm {} \;危险!
-ok command {} \; -exec,但执行前会询问确认(更安全) find . -name "*.tmp" -ok rm {} \;
-delete 删除找到的文件(无需启动外部rm命令,更高效) find /tmp -name "*.old" -delete
-print-print0 输出结果-print0 用空字符分隔文件名,防止含空格的文件名出错,常与 xargs -0 联用 `find . -name “*.txt” -print0

总结:find 命令思维导图

  1. 确定起点 (/, ., /home)
  2. 限制深度 (-maxdepth, -mindepth)
  3. 筛选条件 (可组合):
    • 是什么? (-name, -iname, -regex, -type)
    • 什么时候? (-mtime, -mmin)
    • 多大? (-size, -empty)
    • 谁的? (-user, -perm)
  4. 执行操作:
    • 列出 (-ls, -print)
    • 删除 (-delete)
    • 执行命令 (-exec ... {} \;, -ok)
    • 传递管道 (| xargs)

黄金法则:在使用 -delete-exec rm 等破坏性操作前,先省略这个操作运行命令,确认找到的文件列表是否正确!find ... -exec echo "Would delete: {}" \;

0️⃣ rm命令 - 删除文件

Linux 默认没有回收站,用 rm 删除的文件通常无法恢复。因此,使用任何 rm 命令前,务必确认你要删除的文件路径是正确的。


一、核心参数详解与使用场景

参数 全称/含义 使用场景 风险等级
-i --interactive (交互式) 删除前逐一询问确认。防止误删,适合删除重要或无法确认的文件。 ★☆☆☆☆ (安全)
-f --force (强制) 忽略不存在的文件,不显示任何错误,跳过所有确认提示。用于脚本中或强制覆盖只读文件。 ★★★★★ (极高)
-r / -R --recursive (递归) 递归删除目录及其包含的所有子目录和文件删除目录时必须使用此参数 ★★★★★ (极高)
-v --verbose (详细) 显示每个被删除文件的详细信息。用于确认删除了哪些文件,方便跟踪记录。 ★☆☆☆☆ (安全)
-d --dir (目录) 删除空目录。是 rmdir 命令的功能等价物。 ★★☆☆☆ (中等)
-I (大写 i) 在删除超过3个文件或递归删除前,提示一次确认。比 -i 更友好,比默认更安全。 ★★☆☆☆ (中等)
--preserve-root (保护根目录) 防止对根目录 / 进行递归删除。这是默认行为,永远不要禁用此选项! (保护机制)
--no-preserve-root (禁用根目录保护) 允许递归删除根目录 /这将导致整个系统被销毁,永远不要使用! ☠️ (毁灭性)

二、常用组合与实战场景

1. 安全删除(防误删组合)
# 交互式删除多个文件(每个文件都询问)
rm -i important_file.txt backup_2023.doc

# 智能确认(删除很多文件或目录前问一次)
rm -I -r project_backups/

# 详细模式 + 交互式(清楚看到删什么并确认)
rm -vi *.log

场景:删除用户文档、配置文件等重要数据。推荐将 rm -i 设置为默认别名(见下文技巧)。

2. 强制清理(脚本或已知风险操作)
# 强制删除文件,无视只读权限
rm -f locked_file

# 强制递归删除整个目录树(无任何提示)
rm -rf temp_build_dir/

# 强制删除日志文件,且不显示错误(如文件不存在)
rm -f /var/log/app/*.old.log

场景

  • 在脚本中清理已知的临时目录。
  • 删除大量无需确认的缓存文件。
  • 警告rm -rf 是“毁灭性”命令,使用前必须双重检查路径!著名的 rm -rf / 灾难就是由此而来。
3. 删除空目录
# 删除一个空目录
rm -d empty_dir

# 等同于
rmdir empty_dir

场景:在需要统一用 rm 命令时删除空目录,比 rmdir 更方便组合。

4. 复杂条件删除(与 find 命令组合)

这是最安全、最强大的删除方式,可以精确定位要删除的文件。

# 查找并删除所有 .tmp 临时文件(先打印确认,再执行删除)
find . -name "*.tmp" -type f -exec echo "Found: {}" \;
find . -name "*.tmp" -type f -exec rm {} \;

# 查找并交互式删除 30 天前的日志文件
find /var/log -name "*.log" -mtime +30 -ok rm {} \;

# 查找并直接删除空目录
find . -type d -empty -delete  # 使用 find 自己的 -delete 动作,更高效

场景:清理过期文件、按复杂条件(如时间、大小、类型)批量删除文件。-ok-exec 提供了比 rm -r 更精细的控制


三、致命警告与禁忌

  1. rm -rf /rm -rf /*

    • 含义:强制递归删除根目录下的所有内容。
    • 后果立即摧毁整个操作系统,所有文件、配置、程序都会被删除,系统瞬间瘫痪且无法恢复。
    • 防护:现代 rm 命令默认带有 --preserve-root 选项,会拒绝此操作。但永远不要尝试!
  2. rm -rf .*

    • 本意可能是删除所有隐藏文件。
    • 风险.* 也会匹配到父目录 ..,导致命令变成 rm -rf ..,从而递归删除上级目录的所有内容,同样极其危险。
  3. 变量为空时执行 rm -rf $VAR/

    • 如果变量 $VAR 未定义或为空,命令会变成 rm -rf /,导致灾难。
    • 脚本中的安全写法
      # 先检查变量或路径是否为空/有效
      [[ -n "$TARGET_DIR" ]] && rm -rf "$TARGET_DIR/"
      # 或者
      rm -rf "${TARGET_DIR:?}/"  # 如果 TARGET_DIR 为空或未设置,脚本会报错退出
      

四、安全使用技巧与最佳实践

  1. 设置安全别名(强烈推荐)
    ~/.bashrc~/.bash_aliases 文件中添加:

    alias rm='rm -i'   # 让 rm 默认总是询问确认
    alias rmi='rm -i'  # 或者用新名字
    # 但保留一个真正的强制删除命令
    alias rmf='/bin/rm -f'
    alias rmr='/bin/rm -r' # 谨慎使用
    

    这样,即使你误操作 rm *,也有最后一次确认的机会。

  2. 习惯使用 trash 工具
    安装类似回收站的命令行工具(如 trash-cli),它不会真正删除文件,而是移动到回收站。

    # 安装(Ubuntu/Debian)
    sudo apt install trash-cli
    
    # 使用
    trash-put file.txt  # 删除文件到回收站
    trash-list          # 列出回收站文件
    trash-empty         # 清空回收站
    
  3. 执行删除前的检查步骤

    • 使用 echols 预览
      rm -rf ~/project/  # 先别运行!
      ls -la ~/project/  # 先看看这个目录里是不是你要删的东西
      echo rm -rf ~/project/ # 或者先打印出命令,确认路径无误
      
    • 使用 -v 参数:让 rm 告诉你它正在删除什么。

黄金法则

  • 永远怀疑:输入路径后,在按下回车前再检查一遍。
  • 优先安全:默认加上 -i-I,除非你 100% 确定。
  • 替代方案:考虑用 mv 移动到临时目录代替直接 rm
  • 备份优先:删除任何无法重建的重要东西前,先备份。

1️⃣ chmod命令 – 改变文件或目录权限

语法格式chmod 参数 文件名

1. 符号模式(人类可读)

参数格式 功能描述 示例命令
u/g/o/a 指定用户类型 chmod u+x file
+ 添加权限 chmod a+r file
- 移除权限 chmod go-w file
= 设置精确权限 chmod u=rwx,g=rx file
, 多组权限分隔符 chmod u=rw,g=r,o= file
r 读权限 chmod +r file
w 写权限 chmod -w file
x 执行权限 chmod a+x script.sh
X (大写) 智能执行权限 chmod -R a+X dir/
s SUID/SGID权限 chmod u+s program
t Sticky Bit权限 chmod +t /tmp/

2. 数字模式(精确控制)

格式 说明 示例命令
3位数字 标准权限(rwx) chmod 755 file
4位数字 包含特殊权限(SUID/SGID/Sticky) chmod 2750 dir/

3. 功能增强参数

参数 功能描述 示例命令
-R / --recursive 递归操作目录内容 chmod -R 644 /web/
-v / --verbose 显示操作详情 chmod -v 755 *.sh
-c / --changes 仅显示更改的文件 chmod -c +x script.sh
-f / --silent 静默模式(抑制错误信息) chmod -f 777 /root/secure_file
--reference=RFILE 复制参考文件权限 chmod --reference=src.txt dst.txt
--preserve-root 防止递归修改根目录(安全防护) chmod -R --preserve-root 755 /

4. 特殊权限参数(高级)

权限类型 符号 数字 功能描述 示例命令
SUID u+s 4000 以所有者身份执行 chmod 4755 /usr/bin/passwd
SGID g+s 2000 新建文件继承组权限 chmod 2775 /shared/
Sticky Bit +t 1000 仅所有者可删除文件 chmod 1777 /tmp/

2️⃣ chown命令 - 修改所有者

一、核心参数详解与使用场景

参数 全称/含义 使用场景 示例
-R --recursive (递归) 递归更改目录及其内部所有文件和子目录的所有权。这是最常用的参数。 sudo chown -R user:group /app/
-v --verbose (详细) 显示命令执行的详细信息(每个被更改的文件)。用于确认更改结果和调试。 chown -v user file.txt
-c --changes (变更) 类似 -v,但仅在所有权确实发生更改时显示信息。比 -v 更简洁。 chown -c alice report.doc
-f --silent / --quiet (静默) 抑制大多数错误消息。在脚本中不希望显示错误时使用。 chown -f user missing_file
--dereference (解引用) 作用于符号链接指向的目标文件本身,而不是链接文件。这是默认行为 chown --dereference user symlink
-h / --no-dereference (不解引用) 作用于符号链接文件本身,而不是它指向的目标。用于修改链接文件的属性。 chown -h user symlink
--from=CURRENT_OWNER:CURRENT_GROUP (从…更改) 仅当文件的当前所有者和组匹配指定值时才进行更改。非常安全精确的批量操作。 chown --from=olduser:oldgroup newuser:newgroup *.log
--reference=RFILE (参考文件) 将目标文件的所有者/组设置为与参考文件 RFILE 完全相同。免去手动输入。 chown --reference=model_file target_file

二、所有权指定格式

chown 命令的核心在于如何指定新的所有者和组。

格式 含义 示例 效果
USER 只更改文件所有者 chown alice file.txt -rw-r--r-- alice staff file.txt
USER: 更改文件所有者,并将组改为该用户的登录组 chown alice: file.txt -rw-r--r-- alice alice file.txt
:GROUP 只更改文件所属组 chown :developers file.txt -rw-r--r-- bob developers file.txt
USER:GROUP 同时更改文件所有者和所属组 chown alice:developers file.txt -rw-r--r-- alice developers file.txt

注意:分隔符是冒号 :,在某些旧系统上也支持点 .,但为了兼容性,请始终使用冒号 :

三、权限与故障排除

  1. 谁可以运行 chown

    • 普通用户只能将自己拥有的文件更改为自己所在的组。
    • 只有root用户(使用sudo)可以更改文件的所有者。这是最重要的安全特性之一。
  2. 常见错误:

    • Operation not permitted: 你没有权限更改所有者,请使用 sudo
    • Invalid user or Invalid group: 指定的用户或组不存在。请用 id <username>getent group <groupname> 检查是否存在。
  3. chmod 的区别:

    • chown: 改变拥有这个文件(User和Group)。
    • chmod: 改变所有者可以对文件做什么(Read, Write, Execute)。

四、最佳实践与安全提示

  1. 始终先检查:在执行递归 -R 操作前,先用 ls -l 确认当前所有权,或用 -v 进行“干燥运行”(dry-run)预览。
  2. 谨慎使用 -R:错误的递归所有权更改可能导致系统服务(如Web服务器、数据库)无法访问其文件,从而使服务崩溃。
  3. 使用 --preserve-root:这是默认选项,防止递归操作时误操作根目录 /永远不要禁用它
  4. 理解用户和组:确保你指定的用户和组确实存在且需要相应的访问权限。
  5. 结合ACL进行更精细的控制:对于复杂的权限需求,chown 可能不够用,可以考虑使用访问控制列表(ACL)命令 setfacl

3️⃣rmdir命令 – 删除空目录文件

一、核心参数详解与使用场景

rmdir 的参数相对较少,因为其功能非常专注。

参数 全称/含义 使用场景 示例
(无参数) 删除一个或多个指定的空目录。这是最基本的使用方式。 rmdir empty_folder
-p --parents (父目录) 递归删除空的目录链。如果指定路径中的上级目录在删除后也变为空,则一并删除。 rmdir -p a/b/c
-v --verbose (详细) 显示命令执行的详细过程。用于确认每个被删除的目录,尤其在脚本中很有用。 rmdir -v old_dir
--ignore-fail-on-non-empty (忽略非空错误) 当目录非空时,忽略错误并继续执行。主要用于脚本中,希望跳过非空目录而不中断脚本。 rmdir --ignore-fail-on-non-empty dirs/*

二、常用组合与实战场景

1. 基本使用:删除单个或多个空目录
# 删除一个空目录
rmdir temp_backup

# 删除多个空目录
rmdir dir1 dir2 dir3

场景:清理临时创建的空目录或确认不再需要的空文件夹。这是最直接、最安全的用法。

2. 递归删除空目录链 (-p)
# 删除路径 a/b/c,如果删除 c 后 b 为空,则删除 b,如果 a 也随之变空,则删除 a。
rmdir -p a/b/c

# 详细模式显示过程
rmdir -pv project/logs/2023-old
# 输出: rmdir: removing directory, 'project/logs/2023-old'
#       rmdir: removing directory, 'project/logs'
#       rmdir: removing directory, 'project'   (如果都变为空)

场景:清理一个空的嵌套目录结构。例如,在卸载软件或清理项目生成的空目录树时非常有用。这是 rmdir 最强大的功能

3. 在脚本中使用(忽略错误与详细输出)
# 尝试删除一批目录,跳过非空的,并显示成功删除的
rmdir -v --ignore-fail-on-non-empty /tmp/app_cache/*

# 常用于循环或条件判断中
for dir in /data/*/; do
  rmdir "$dir" 2>/dev/null && echo "成功删除空目录: $dir"
done

场景:在自动化脚本中安全地清理可能为空的缓存目录、临时目录等,避免因为个别目录非空而导致脚本报错中断。


三、rmdirrm -r / rm -d 的区别与选择

这是一个非常重要的决策点。

命令 功能 安全性 适用场景
rmdir 只能删除空目录 非常高 确认目录已空,希望安全删除
rm -d 删除空目录(功能同 rmdir 非常高 想统一使用 rm 命令时
rm -r 递归强制删除目录及所有内容 极低(危险) 确定要删除整个目录树,包括所有文件和子目录

示例

# 错误做法:想清空目录,却用了毁灭性命令
rm -rf my_project/ # 万一输错了路径呢?

# 安全做法:
# 1. 先删除目录内的所有文件
rm my_project/*   # 先用非递归删除文件
# 2. 再删除空目录
rmdir my_project

# 或者使用 find 安全清空
find my_project -type f -delete # 只删除所有文件,保留目录结构
find my_project -type d -empty -delete # 删除所有空目录

四、错误处理与注意事项

  1. rmdir: failed to remove 'dir': Directory not empty

    • 原因:目录不为空。
    • 解决:使用 ls -a dir 检查是否有隐藏文件(如 .git),清空后再删除,或改用 rm -r dir
  2. rmdir: failed to remove 'dir': Permission denied

    • 原因:你对目标目录没有写权限。
    • 解决:使用 sudo 提升权限(需谨慎),或更改目录权限。
  3. rmdir: failed to remove 'dir': No such file or directory

    • 原因:目录不存在。
    • 解决:检查路径拼写。

总结

场景 推荐命令/组合 优点
删除已知的空目录 rmdir dir_name 简单、安全
删除空的嵌套目录 rmdir -p a/b/c 一次性清理整条空链
脚本中安全清理 rmdir --ignore-fail-on-non-empty 不会因错误中断
批量查找并删除空目录 find . -type d -empty -delete 高效、精准
不确定是否为空,且想强制删除 rm -r dir_name 彻底,但极度危险

Linux 文件管理命令组合实战示例

一、项目部署工作流:开发 → 测试 → 生产

# 1. 进入开发目录
pushd ~/project/dev
# 2. 编译项目
make && make test
# 3. 复制到测试环境(保留权限)
cp -a build/ ../test/
# 4. 进入测试目录
pushd ../test
# 5. 设置测试权限
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
chmod 755 run_tests.sh
# 6. 执行测试
./run_tests.sh
# 7. 部署到生产
popd # 返回dev目录
sudo cp -a build/ /opt/production/
# 8. 设置生产权限
sudo chmod -R u=rwX,g=rX,o= /opt/production
sudo chmod 2750 /opt/production/shared_data
# 9. 清理目录栈
popd

关键组合

  • pushd/popd:目录导航
  • cp -a:保留属性的复制
  • find + chmod:批量权限设置
  • chmod g+s:设置SGID实现组协作

二、日志分析任务:多目录切换与权限修复

# 1. 创建临时工作区
mkdir -p ~/log_analysis/tmp && chmod 700 ~/log_analysis/tmp
# 2. 进入日志目录
pushd /var/log
# 3. 复制需要分析的日志(不覆盖已有文件)
cp -n --preserve=all apache/*.log ~/log_analysis/
cp -n --preserve=all nginx/*.log ~/log_analysis/
# 4. 切换到分析目录
pushd ~/log_analysis
# 5. 修复权限(可能复制的日志权限过高)
chmod -R go-rwx .  # 移除组和其他权限
chmod -R u+rw .    # 确保用户读写权限
# 6. 分析日志
zgrep "ERROR" *.log > errors.txt
# 7. 压缩结果
chmod 600 errors.txt
gzip errors.txt
# 8. 返回原始目录
popd # 回/var/log
popd # 回起始目录
# 9. 清理临时文件
pushd ~/log_analysis
rm -rf tmp
popd

关键组合

  • cp -n --preserve:安全复制保留属性
  • chmod -R go-rwx:快速私有化文件
  • zgrep + chmod:安全处理敏感日志
  • 多层pushd/popd:复杂目录导航

三、权限修复与备份:系统维护任务

# 1. 创建备份目录(带时间戳)
BACKUP_DIR="/backup/$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR" && chmod 700 "$BACKUP_DIR"
# 2. 进入需要修复的目录
pushd /var/www
# 3. 备份原始权限
find . -exec stat -c "%a %n" {} \; > "$BACKUP_DIR/permissions.bak"
# 4. 递归修复目录权限
find . -type d -exec chmod 755 {} \;
# 5. 修复文件权限
find . -type f -exec chmod 644 {} \;
# 6. 特殊处理上传目录
pushd uploads
chmod 1777 .  # Sticky bit防止用户互删文件
popd
# 7. 设置可执行脚本权限
find . -name "*.cgi" -exec chmod 755 {} \;
# 8. 创建权限恢复脚本
echo '#!/bin/bash' > "$BACKUP_DIR/restore_perms.sh"
awk '{print "chmod", $2, $1}' "$BACKUP_DIR/permissions.bak" >> "$BACKUP_DIR/restore_perms.sh"
chmod 700 "$BACKUP_DIR/restore_perms.sh"
# 9. 返回并验证
popd
echo "修复完成!恢复脚本:$BACKUP_DIR/restore_perms.sh"

关键组合

  • find + stat:权限备份
  • find + chmod:批量权限修复
  • chmod 1777:特殊权限设置
  • 权限恢复脚本:自动化回滚方案

四、多环境配置同步:开发→测试→生产

# 1. 定义基础目录
DEV_DIR=~/projects/app_dev
TEST_DIR=~/projects/app_test
PROD_DIR=/opt/app

# 2. 开发环境工作
pushd "$DEV_DIR"
# ... 开发代码 ...
# 3. 同步到测试环境
rsync -av --delete --exclude='.git' ./ "$TEST_DIR/"
# 4. 设置测试环境权限
pushd "$TEST_DIR"
chmod -R u=rwX,g=rX,o= .
chmod 750 config/secure/
popd

# 5. 准备生产发布
# 创建版本目录
PROD_VER="$PROD_DIR/versions/$(date +%Y%m%d_%H%M)"
mkdir -p "$PROD_VER" 
# 复制文件
cp -a "$DEV_DIR"/* "$PROD_VER"
# 设置生产权限
pushd "$PROD_VER"
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
chmod 755 bin/start.sh
chmod 2750 shared/
# 创建符号链接
popd
ln -snf "$PROD_VER" "$PROD_DIR/current"

# 6. 清理旧版本
find "$PROD_DIR/versions" -mtime +30 -exec rm -rf {} \;

# 7. 返回开发目录
popd

关键组合

  • rsync -av --delete:精确目录同步
  • chmod -R u=rwX,g=rX,o=:智能权限设置
  • cp -a + ln -snf:版本化部署
  • find -mtime:自动清理旧版本

五、应急恢复场景:系统故障修复

# 1. 进入救援环境
cd /
# 2. 创建紧急备份
mkdir /mnt/backup
pushd /mnt/backup
mkdir etc home var
# 3. 备份关键配置(保留权限)
cp -a /etc/passwd /etc/group etc/
cp -a /etc/shadow etc/ && chmod 600 etc/shadow
# 4. 备份用户数据
cp -a /home/* home/ && chmod -R go-rwx home/
# 5. 备份日志(仅复制新文件)
cp -au /var/log/* var/
# 6. 修复错误权限(示例:误执行 chmod -R 777 /)
pushd /
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
# 特殊目录修复
chmod 1777 /tmp
chmod 755 /var/log
chmod 700 /root
chmod 4755 /usr/bin/sudo
# 7. 从备份恢复关键文件
cp -a /mnt/backup/etc/* /etc/
# 8. 验证恢复
popd
ls -ld /tmp /etc/shadow /usr/bin/sudo

关键组合

  • cp -a:权限精确备份
  • cp -au:增量备份
  • 分层find + chmod:系统权限修复
  • 关键服务权限恢复(sudo等)

命令组合最佳实践总结

场景 核心命令组合 关键参数
项目部署 pushd+cp -a+chmod -R -a保留属性, u=rwX智能执行
日志分析 cp -n --preserve+chmod go-rwx -n防覆盖, go-rwx私有化
权限修复 find -exec stat+find -exec chmod 精确路径控制
多环境同步 rsync -av --delete+chmod -R --delete镜像同步
系统恢复 cp -au+分层chmod -u增量备份, 特殊权限修复

黄金法则

  1. 导航:使用 pushd/popd 管理复杂目录跳转
  2. 复制:优先 cp -a 保留属性,-n 避免覆盖
  3. 权限chmod -R 配合 find 精确控制
  4. 安全:敏感文件使用 chmod 600,目录用 700
  5. 恢复:关键操作前备份权限 (stat -c "%a %n")

由 AI 提供后整理汇总


网站公告

今日签到

点亮在社区的每一天
去签到