文件管理
文件管理是Linux系统中最基础也是最核心的操作之一。在Linux系统中,所有数据都以文件的形式存储和管理,因此掌握文件管理命令对于高效使用Linux系统至关重要。
本章节将详细介绍Linux系统中常用的文件管理命令,包括目录切换、文件复制、删除、移动、查找、统计等操作。通过学习这些命令,您将能够熟练地管理和操作Linux系统中的文件和目录,提高工作效率。
ls - 列出目录内容
命令简介
ls 是Linux/Unix系统中最基础且使用频率最高的命令之一,用于列出目录中的文件和子目录信息。支持显示文件属性(权限、所有者、大小等),并能通过参数控制显示格式和排序方式。
语法格式
ls [选项] [文件/目录...]选项
| 选项 | 描述 | 示例 |
|---|---|---|
-a | 显示所有文件(包括隐藏文件) | ls -a ~ |
-l | 长格式显示(文件详情) | ls -l /var/log |
-h | 人类可读的文件大小(配合-l使用) | ls -lh |
-t | 按修改时间排序(最新优先) | ls -lt |
-r | 反向排序 | ls -lr |
-R | 递归列出子目录内容 | ls -R /etc |
--color | 彩色输出(自动区分文件类型) | ls --color=auto |
-S | 按文件大小排序 | ls -lS |
-i | 显示inode编号 | ls -i |
经典案例
# 查看当前目录的隐藏文件(包括.和..)
ls -a
# 递归列出/var目录内容,显示文件详情和人类可读大小
ls -lhR /var
# 按修改时间倒序列出日志文件(最新修改的在前)
ls -lt /var/log/*.log
# 查看文件的inode信息(用于处理特殊文件名)
ls -i "奇怪 文件名.txt"注意事项
- 默认不显示以点开头的隐藏文件(需加
-a参数) - 不同发行版的
--color参数可能默认启用(可通过ls --color=never禁用) - 处理含空格的文件名时建议用引号包裹:
ls "my file.txt" - 在脚本中使用
ls解析文件名时存在风险(建议改用find或for循环)
pwd - 打印当前工作目录
命令简介
pwd(Print Working Directory)命令用于显示当前所在目录的绝对路径。这是一个简单但极其重要的命令,特别在复杂的目录结构中操作时,能帮助用户快速确认当前位置。
语法格式
pwd [选项]选项
| 选项 | 描述 | 示例 |
|---|---|---|
-L | 显示逻辑路径(默认) | pwd -L |
-P | 显示物理路径(解析符号链接) | pwd -P |
经典案例
# 基本用法:显示当前目录
pwd
# 输出示例:/home/user/projects
# 在符号链接目录中使用物理路径显示
cd /var/mail # 通常是/var/spool/mail的符号链接
pwd -P
# 输出示例:/var/spool/mail注意事项
- 在脚本中使用时建议加上
-P选项以避免符号链接导致的路径问题 - 当目录被删除但仍在其中时,某些系统可能显示已删除目录的路径
- 与
cd命令配合使用可以快速记录和返回特定目录:
SAVED_DIR=$(pwd)
cd /some/long/path
# ...执行操作...
cd "$SAVED_DIR"cd - 切换工作目录
命令简介
cd(Change Directory)命令用于切换当前工作目录,是Linux/Unix系统中最基础且最常用的命令之一。通过改变工作目录,用户可以导航到不同的文件系统位置。
语法格式
cd [选项] [目录]选项
| 选项 | 描述 | 示例 |
|---|---|---|
| (无) | 切换到用户主目录 | cd |
- | 切换到前一个工作目录 | cd - |
~ | 切换到用户主目录 | cd ~ |
.. | 切换到上级目录 | cd .. |
经典案例
# 切换到用户主目录
cd
# 切换到/etc目录
cd /etc
# 切换到相对路径的目录
cd ../other_directory
# 在前一个目录和当前目录之间切换
cd -
# 输出示例:/home/user/previous_directory
# 使用环境变量切换目录
cd $HOME/projects
# 切换到包含空格的特殊目录名
cd "My Documents"注意事项
- 如果目录不存在,会显示错误信息:
cd: no such file or directory: dirname - 目录名包含特殊字符(如空格)时需要用引号包裹
- 在脚本中使用
cd时建议检查返回值:
cd /target/directory || exit 1- 使用
pushd和popd可以创建目录栈实现更灵活的目录切换
cp - 复制文件或目录
cp命令来自英文单词copy的缩写,中文译为“复制”,其功能是复制文件或目录。cp命令能够将一个或多个文件或目录复制到指定位置,亦常用于文件的备份工作。
语法格式
cp [选项] 源文件 目标文件
# 复制单个文件cp [选项] 源文件1 源文件2 ... 目标目录
# 复制多个文件到目录cp [选项] -t 目标目录 源文件1 ...
# 指定目标目录(批量复制)选项
| 参数 | 说明 | 示例 |
|---|---|---|
-i | 交互模式(覆盖前询问) | cp -i file.txt backup/ |
-f | 强制覆盖(不提示) | cp -f file.txt /强制路径/ |
-r/-R | 递归复制目录及子内容 | cp -r dir1/ dir2/ |
-v | 显示详细操作信息 | cp -v *.log logs/ |
-a | 归档模式(保留权限、时间戳等) | cp -a source/ backup/ |
-p | 保留文件属性(同归档模式) | cp -p file.txt dest/ |
-u | 增量复制(仅更新新文件) | cp -u *.csv latest/ |
-l | 创建硬链接(非复制文件) | cp -l data.db backup.db |
-s | 创建符号链接(软链接) | cp -s /path/to/file link |
-n | 不覆盖已存在文件 | cp -n *.txt safe_dir/ |
-t | 指定目标目录(批量操作) | cp -t dest/ file1 file2 |
经典案例
cp file1.txt file2.txt # 文件到文件复制
cp *.jpg /target_dir/ # 批量复制到目录
cp -v /etc/*.conf ~/backup/ # 显示详细复制过程
cp -r source_dir/ dest_dir/ # 递归复制目录
cp -a /etc/ /backup/etc_full/ # 完整保留属性复制(包括隐藏文件)
cp --backup=numbered file.txt dest/ # 自动备份冲突文件(生成file.txt.~1~)
cp -u *.log /archive/ # 仅复制更新的日志文件
cp -l bigfile.dat backup/ # 创建硬链接节省空间
cp -r --exclude="*.tmp" src/ dst/ # 递归复制但排除临时文件rm - 删除文件或目录
删除文件或目录
语法格式
rm [选项] [文件或目录...]选项
| 选项 | 描述 | 示例 |
|---|---|---|
-f | 强制删除,忽略不存在的文件和不提示 | rm -f file.txt |
-i | 交互式删除,删除前询问确认 | rm -i file.txt |
-r 或 -R | 递归删除目录及其内容 | rm -r directory |
-v | 显示删除的详细信息 | rm -v file.txt |
-d | 删除空目录(类似 mkdir 命令)。 | rm -d directory |
--preserve-root | 默认保护根目录 / ,防止误删(现代系统默认启用)。 | rm --preserve-root |
--no-preserve-root | 危险!允许删除根目录(仅在特殊场景使用)。 | rm --no-preserve-root |
--help | 显示帮助信息 | rm --help |
--version | 显示版本信息 | rm --version |
经典案例
rm file.txt # 删除单个文件
rm *.tmp # 通配符删除临时文件
rm -v log_*.txt # 显示删除的每个文件
rm -r old_project/ # 递归删除目录
rm -rf node_modules/ # 强制删除(无确认)
rm -I *.bak # 批量删除但提示一次确认
rm -i important* # 每个匹配文件都确认注意事项
不可恢复性:Linux 没有回收站,删除后通常无法恢复
根目录保护:现代系统默认
--preserve-root防止误删/符号链接行为:
bashrm symlink # 只删除链接本身 rm -r symlink/ # 删除链接指向的内容(危险!)
☠️ 著名危险操作:
rm -rf /或rm -rf *在错误目录执行会导致灾难性后果
删除保护措施
- 设置
alias rm='rm -I'在.bashrc中 - 重要文件先
chattr +i设置不可删除属性 - 使用
--one-file-system防止跨文件系统删除 - 定期备份重要数据
- 建议管理员将
rm -rf /等危险命令加入sudoers禁用列表。
mv - 移动或重命名文件
mv命令来自英文单词move的缩写,中文译为“移动”,其功能与英文含义相同,能够对文件进行剪切和重命名操作。
语法格式
mv [选项] 源文件或目录 目标文件或目录mv [选项] 源文件1 源文件2 ... 目标目录选项
| 选项 | 描述 | 示例 |
|---|---|---|
-i | 交互模式(覆盖前询问) | mv -i file.txt newfile.txt |
-f | 强制移动(不询问,直接覆盖) | mv -f file.txt /backup/ |
-n | 不覆盖已存在的文件 | mv -n file.txt /backup/ |
-u | 仅当源文件比目标文件新时才移动 | mv -u file.txt /backup/ |
-v | 显示详细操作信息 | mv -v file.txt /backup/ |
--help | 显示帮助信息 | mv --help |
--version | 显示版本信息 | mv --version |
经典案例
mv oldname.txt newname.txt # 文件重命名
mv *.jpg /target_directory/ # 移动多个文件
mv old_dir/ new_dir/ # 目录重命名
mv dir1/ dir2/ dir3/ target/ # 移动多个目录
mv -i important.txt backup/ # 覆盖前确认
mv -n *.log logs/ # 跳过已存在文件
mv -b config.conf backup/ # 覆盖前创建备份(生成config.conf~)
mv -v {file1,file2,file3} destination/ # 显示移动过程
mv -S .bak -b old.c new.c # 指定备份后缀(生成new.c.bak)
find . -name "*.tmp" -exec mv {} /tmp \; # 结合find移动文件、
mv -- -奇怪文件 正常文件名 # 处理特殊字符文件名
mv "$(date +%Y%m%d).log" archive/ # 使用日期变量注意事项
跨文件系统移动实际是"复制+删除"操作
权限保留:移动后保留原文件属性(同分区)
符号链接行为:
bashmv symlink target/ # 移动链接本身 mv symlink/ target/ # 移动链接指向内容(需-R)
find -搜索文件或目录
find 用于在指定目录及其子目录中搜索文件或目录,支持按名称、类型、大小、时间、权限等条件过滤,并能对结果执行操作(如删除、复制、执行命令等)。
语法格式
find [搜索路径] [表达式] [操作]选项
基础条件
| 选项 | 说明 | 示例 |
|---|---|---|
-name PATTERN | 按文件名匹配(区分大小写,支持通配符 * ? []) | find /home -name "*.txt" |
-iname PATTERN | 按文件名匹配(不区分大小写) | find /home -iname "readme*" |
-type TYPE | 按类型过滤:f(文件)、d(目录)、l(符号链接)等 | find /var -type d |
-path PATTERN | 按路径匹配(支持通配符,匹配完整路径) | |
-regex PATTERN | 按正则表达式匹配路径(需用 -regextype 指定类型,如 posix-extended) |
按时间过滤
| 选项 | 说明 | 示例 |
|---|---|---|
-mtime N | 按文件修改时间(N 天前,+N 表示超过 N 天,-N 表示 N 天内) | find / -mtime -7 |
-atime N | 按文件访问时间 | |
-ctime N | 按文件状态(如权限)修改时间 | |
-mmin N | 按修改时间(分钟,+N/-N 同上) | |
-newer FILE | 比指定文件更新的文件 |
按大小过滤
| 选项 | 说明 | 示例 |
|---|---|---|
-size N[bcwkMG] | 按文件大小:N 为数值,单位可选 c(字节)、k(KB)、M(MB)等,+N 表示大于,-N 表示小于 | find / -size +10M |
-empty | 查找空目录 | find / -empty |
按搜索深度
| 选项 | 说明 | 示例 |
|---|---|---|
-maxdepth N | 最多搜索N层如:-maxdepth 7 | find / -maxdepth 3 -name "*.conf" |
-mindepth N | 从第N层开始搜索如-mindepth 3 | find / -mindepth 3 -name "*.conf" |
按权限过滤
| 选项 | 说明 | 示例 |
|---|---|---|
-perm MODE | 精确匹配权限(如 -perm 644) | |
-perm -MODE | 匹配至少包含指定权限(如 -perm -u=r 表示用户有读权限) | |
-perm /MODE | 匹配任意位权限(如 -perm /o=w 表示其他用户有写权限) | |
-user username | 匹配指定用户的文件如:-user www | find /home -user alice |
-group groupname | 匹配指定组的文件如:group www | |
-nouser | 匹配没有属主的文件 |
逻辑操作符
| 选项 | 说明 |
|---|---|
-and / -a | 逻辑与(默认) |
-or / -o | 逻辑或 |
-not / ! | 逻辑非 |
() | 分组条件(需转义为 $ ... $) |
执行操作
| 选项 | 说明 | 示例 |
|---|---|---|
-print | 打印结果(默认操作) | |
-delete | 删除匹配的文件/目录 | find /tmp -name "*.tmp" -delete |
-exec COMMAND \; | 对结果执行命令({} 表示匹配项,\; 结束符) | find . -name "*.log" -exec rm {} \; |
-ok COMMAND \; | 交互式执行命令(需用户确认) | |
-print0 | 输出以 \0 分隔(配合 xargs -0 处理含空格的文件名) |
应用场景
1. 按名称搜索文件
find /var/log -name "*.log" # 搜索 /var/log 下所有 .log 文件
find ~ -iname "readme.md" # 忽略大小写搜索用户主目录下的 README 文件2. 按类型过滤
find /etc -type d # 查找 /etc 下的所有目录
find . -type f -name "*.tmp" # 查找当前目录下的 .tmp 文件3. 按时间过滤
find /backup -mtime +7 # 查找 7 天前修改过的文件
find ~/Downloads -mmin -10 # 查找 10 分钟内修改过的文件
find . -newer reference.txt # 比 reference.txt 更新的文件4. 按大小过滤
find /var -size +10M # 查找大于 10MB 的文件
find ~/ -size -100k # 查找小于 100KB 的文件5. 按权限过滤
find /usr/bin -perm 755 # 查找权限为 755 的文件
find . -perm -u=rwx # 查找用户有读、写、执行权限的文件6. 组合条件
# 查找当前目录下 7 天前修改的 .log 文件,且大小超过 1MB
find . -name "*.log" -mtime +7 -size +1M
# 查找用户主目录下的目录或 .jpg 文件
find ~ $ -type d -o -name "*.jpg" $7. 执行操作
# 删除所有 .tmp 文件
find /tmp -name "*.tmp" -delete
# 将找到的 .txt 文件复制到 backup 目录
find . -name "*.txt" -exec cp {} ~/backup \;
# 交互式删除旧日志文件
find /var/log -name "*.log" -mtime +30 -ok rm {} \;8. 处理含空格或特殊字符的文件名
find . -name "*.pdf" -print0 | xargs -0 -I {} mv {} ~/Documents9. 排除特定目录
find /path -name "*.log" -not -path "*/exclude_dir/*"10. 限制搜索深度
find /var -maxdepth 2 -name "*.conf" # 仅搜索 /var 及其下一级子目录11. 结合正则表达式
find . -regextype posix-extended -regex ".*/(2023|2024)-[0-9]{2}.log"12. 统计文件数量
find /var/log -type f | wc -l # 统计文件总数注意事项
- 性能影响:在根目录
/下运行find可能会消耗大量资源,建议指定具体路径。 - 权限问题:如果没有权限访问某些目录,
find会报错(可使用2>/dev/null忽略错误)。 -exec语法:必须以\;结尾,{}表示匹配的文件名。- 危险操作:
-delete或-exec rm会直接删除文件,务必确认条件正确! - 通配符转义:使用
-name时,通配符需用引号包裹(如"*.txt")。
md5sum - 效验文件
md5sum 是 Linux/Unix 系统中用于计算和校验文件 MD5 哈希值的工具。MD5(Message-Digest Algorithm 5)是一种广泛使用的密码散列函数,可生成 128 位(16字节)哈希值,常用于验证文件完整性。
语法格式
md5sum [选项] [文件...]选项
| 选项 | 作用 |
|---|---|
-b | 二进制模式读取文件 |
-c | 从文件中读取 MD5 校验值并验证 |
--tag | 生成 BSD 风格的校验值 |
-t | 文本模式读取文件(默认) |
--quiet | 校验失败时不输出警告信息 |
--status | 不输出任何信息,通过返回状态码表示结果 |
经典案例
md5sum file.txt # 计算单个文件的 MD5 值
md5sum file.txt > checksum.md5 # 生成校验文件
md5sum -c checksum.md5 # 验证文件 输出:file.txt: OK注意事项
- MD5 安全性
- MD5 已被证明存在碰撞漏洞,不适用于安全敏感场景(如密码存储)。
- 需要更高安全性时,应使用
sha256sum或sha512sum。
- 大文件处理
- 计算大文件时可能耗时较长,但内存占用较低。
- 跨平台一致性
- Windows 的
certutil -hashfile和 macOS 的md5命令输出格式不同,需注意兼容性。
- Windows 的
- 校验文件格式
- 使用
-c时,校验文件必须是MD5值 文件名格式(如d41d8cd... file.txt)。
- 使用
- 隐藏文件
- 对隐藏文件(如
.bashrc)同样有效。
- 对隐藏文件(如
chattr - 更改文件属性
chattr 命令用于更改 Linux 文件系统上的文件属性,这些属性比标准文件权限(如 chmod 设置的权限)更底层。它常用于设置文件不可删除、不可修改等特殊属性,特别适合系统关键文件的保护。
语法格式
chattr [选项] [+/-/=属性] 文件...选项
| 选项 | 描述 | 示例 |
|---|---|---|
-R | 递归处理目录及其内容 | chattr -R +i /etc |
-V | 显示详细的输出信息 | chattr -V +a file.txt |
-f | 抑制大部分错误信息 | chattr -f +i file.txt |
属性
| 属性 | 描述 | 示例 |
|---|---|---|
+a | 只能追加内容(不能修改已有内容) | chattr +a logfile.log |
+i | 不可修改(不能删除、重命名、修改内容、创建链接) | chattr +i /etc/passwd |
+A | 不更新文件的访问时间 | chattr +A database.db |
+c | 文件会被自动压缩存储 | chattr +c largefile.iso |
+u | 文件被删除后,内容仍可恢复 | chattr +u important.doc |
- | 移除属性 | chattr -i protected.sh |
经典案例
# 保护关键系统文件不被修改
sudo chattr +i /etc/passwd /etc/shadow /etc/group
# 允许日志文件只能追加内容
chattr +a /var/log/syslog
# 递归设置目录下所有文件不可修改
chattr -R +i /etc/nginx/
# 查看文件属性(使用 lsattr)
lsattr /etc/passwd
# 移除文件的不可修改属性
chattr -i /etc/resolv.conf注意事项
- 大多数
chattr操作需要 root 权限 - 即使 root 用户也无法修改设置了
+i属性的文件 - 某些属性(如
+c压缩)只在特定文件系统(如 ext2/ext3/ext4)上有效 - 使用
-R递归选项时要特别小心,可能会意外锁定整个目录树 lsattr命令用于查看当前设置的属性
lsattr - 列出文件属性
lsattr 命令用于显示 Linux 文件系统上的文件扩展属性,这些属性是比标准文件权限更底层的控制标志。它通常与 chattr 命令配合使用,用于查看文件是否被设置为不可删除、不可修改等特殊状态。
语法格式
lsattr [选项] [文件...]选项
| 选项 | 描述 | 示例 |
|---|---|---|
-R | 递归列出目录及其内容的属性 | lsattr -R /etc |
-d | 显示目录本身的属性 | lsattr -d /var/log |
-a | 显示所有文件包括隐藏文件 | lsattr -a ~ |
-v | 显示文件版本/生成号 | lsattr -v /bin/bash |
-p | 以数字形式显示属性 | lsattr -p /etc/passwd |
属性标志说明
| 标志 | 含义 |
|---|---|
a | 只能追加内容(append only) |
A | 不更新访问时间(no atime updates) |
c | 压缩存储(compressed) |
d | 不进行 dump 备份(no dump) |
e | 使用 extents 格式存储(extent format) |
i | 不可修改(immutable) |
j | 数据日志(data journaling) |
s | 安全删除(secure deletion) |
t | 禁用 tail-merging(no tail-merging) |
u | 可恢复删除(undeletable) |
经典案例
# 查看关键系统文件的属性
sudo lsattr /etc/passwd /etc/shadow
# 递归查看目录下所有文件的属性
lsattr -R /etc/nginx/
# 查看目录本身的属性(而非内容)
lsattr -d /var/log
# 查看隐藏文件的属性
lsattr -a ~
# 结合 grep 查找被锁定的文件
lsattr -R / | grep "\----i-------"注意事项
- 需要 root 权限才能查看某些系统文件的完整属性
- 属性标志
-表示该属性未设置 - 某些属性只在特定文件系统(如 ext2/ext3/ext4)上有效
- 在递归模式(
-R)下可能会显示大量输出,建议重定向到文件 - 属性标志的顺序和位置不影响其含义
inotifywait - 监控文件系统事件
简介
inotifywait 是 Linux 下基于 inotify 机制的文件系统监控工具,属于 inotify-tools 软件包的一部分。它可以阻塞式地等待文件系统事件(如文件创建、修改、删除等),非常适合用于编写自动化脚本。
语法格式
inotifywait [-hcmrq] [-e <event>] [-t <seconds>] [--format <fmt>] [--timefmt <fmt>] <file> [<file> ...]选项
| 选项 | 描述 | 示例 |
|---|---|---|
-h | 显示帮助信息 | inotifywait -h |
-m | 持续监控模式(不退出) | inotifywait -m /tmp |
-r | 递归监控目录 | inotifywait -r /var/log |
-q | 减少冗余输出 | inotifywait -q /home |
-e <event> | 指定监控的事件类型 | inotifywait -e create,delete /tmp |
-t <seconds> | 设置超时时间(秒) | inotifywait -t 60 /opt |
--format <fmt> | 自定义输出格式 | inotifywait --format '%T %w%f' /tmp |
--timefmt <fmt> | 设置时间格式 | inotifywait --timefmt '%Y-%m-%d' /tmp |
--exclude <pattern> | 大小写敏感的正则表达式排除模式 | inotifywait -r --exclude '^/tmp/backup' /tmp |
--excludei <pattern> | 大小写不敏感的正则表达式排除模式 | inotifywait -r --excludei '\.log$' /var |
--fromfile <file> | 从文件读取排除模式(每行一个) | inotifywait -r --fromfile exclude_list.txt /data |
--format占位符
| 占位符 | 描述 | 示例输出 |
|---|---|---|
%w | 监控的目录路径 | /tmp |
%f | 触发事件的文件名(目录事件为空) | test.log |
%e | 事件类型(多个事件用逗号分隔) | CREATE,MODIFY |
%T | 当前时间(需配合--timefmt使用) | 2025-06-12 14:30:00 |
--timefmt占位符
| 参数 | 说明 | 示例输出 |
|---|---|---|
%Y | 4位年份 | 2025 |
%y | 2位年份 | 25 |
%m | 月份(01-12) | 06 |
%d | 日期(01-31) | 13 |
%H | 小时(00-23) | 15 |
%M | 分钟(00-59) | 30 |
%S | 秒(00-59) | 45 |
%A | 星期全称 | Friday |
%a | 星期缩写 | Fri |
%B | 月份全称 | June |
%b | 月份缩写 | Jun |
%F | 等价于 %Y-%m-%d | 2025-06-13 |
%T | 等价于 %H:%M:%S | 15:30:45 |
%Z | 时区 | CST |
%z | 时区偏移 | +0800 |
%s | Unix时间戳(秒) | 176543210 |
%N | 纳秒(需高精度支持) | 123456789 |
-e <event>事件
| 事件名称 | 描述 |
|---|---|
access | 文件或目录被读取 |
modify | 文件内容被修改(目录的修改时间变化) |
attrib | 文件或目录的元数据(权限、所有者、时间戳等)被修改 |
move | 文件或目录被移动(源目录触发) |
move_to | 文件或目录被移动到监控目录(目标目录触发) |
create | 在监控目录内创建新文件或子目录 |
open | 文件或目录被打开 |
close | 文件或目录被关闭(无论读写模式) |
delete | 文件或目录被删除 |
umount | 包含监控项目的文件系统被卸载 |
经典案例
# 监控/tmp目录下的文件创建和删除事件
inotifywait -m -e create,delete /tmp
# 递归监控网站目录的文件修改(用于触发自动部署)
inotifywait -mrq --format '%w%f' -e modify /var/www/html | while read file
do
echo "文件已修改: $file"
# 在此添加部署逻辑
done
# 带时间戳的监控输出
inotifywait -m --format '%T %w%f %e' --timefmt '%F %T' /data/logs
# 监控关键文件操作(创建/修改/删除/移动)
inotifywait -e create,modify,delete,move /important/files
# 监控权限变更和属性修改
inotifywait -e attrib /sensitive/data
# 递归监控/data但排除所有.git目录
inotifywait -mr --exclude '/\.git/' /data
# 监控网站目录但排除缓存和临时文件(不区分大小写)
inotifywait -mr --excludei '\.(sw[px]|tmp|bak)' /var/www
# 使用排除列表文件监控
echo -e "*.tmp\n*.bak\n/tmp/old/" > exclude.txt
inotifywait -mr --fromfile exclude.txt /home/user注意事项
- 需要先安装 inotify-tools 包:
sudo apt install inotify-tools(Debian/Ubuntu) - 监控大量文件时可能触及系统默认的 inotify 限制,可通过修改
/proc/sys/fs/inotify/max_user_watches调整 - 在 NFS 等网络文件系统上监控可能不可靠
- 使用
-m持续监控模式时需配合管道或重定向使用,否则会持续输出到控制台 - 监控目录需要有读取权限
rsync - 远程文件同步工具
简介
rsync 是 Linux 下强大的文件同步工具,采用差异算法实现高效传输,支持本地和远程文件同步,能够只传输文件的变化部分,显著提高传输效率。
语法格式
rsync [OPTION]... SRC [SRC]... DEST
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST:SRC [DEST]选项
| 选项 | 描述 | 示例 |
|---|---|---|
-a | 归档模式(相当于-rlptgoD) | rsync -a /src /dest |
-v | 显示详细输出 | rsync -v file.txt backup:/backup |
-z | 传输时压缩数据 | rsync -az /data server:/backup |
-h | 人类可读格式输出 | rsync -ah /src /dest |
-P | 显示进度并支持断点续传 | rsync -aP largefile user@host:/path |
-e ssh | 指定远程shell | rsync -e "ssh -p 2222" /src user@host:/dest |
--delete | 删除目标端多余文件 | rsync -a --delete /src/ /dest/ |
--exclude=PATTERN | 排除匹配文件 | rsync -a --exclude='*.tmp' /src /dest |
--bwlimit=KBPS | 限制带宽(KB/s) | rsync --bwlimit=1000 /src server:/dest |
经典案例
# 本地目录同步(保留所有属性)
rsync -av /path/to/src/ /path/to/dest/
# 远程同步到本地(使用SSH加密)
rsync -azP user@remote:/path/to/src/ /local/dest/
# 同步时排除特定文件
rsync -av --exclude='*.log' --exclude='temp/' /src/ user@host:/dest/
# 镜像同步(完全一致)
rsync -a --delete /src/ /dest/
# 带宽限制同步(1MB/s)
rsync -av --bwlimit=1000 /largefiles/ backup:/storage/注意事项
- 源目录结尾的
/很重要:带/表示同步目录内容,不带/表示同步目录本身 - 首次同步大文件建议使用
-P参数以便查看进度 --delete操作会永久删除目标端文件,使用前建议先不加此参数测试- 远程同步需要配置SSH免密登录以便自动化
- 可通过
--dry-run参数模拟运行而不实际执行
