如何通过CentOS的readdir函数轻松实现高效文件迁移?
- 内容介绍
- 文章标签
- 相关推荐
在进行文件迁移之前,先说说需要明确源目录和目标目录。
1. 先确定好源目录与目标目录
很多同学在开始迁移时会出现“忘记指定目标方法导致文件丢失”或“误删源文件”的痛点。提前把两条方法写清楚,能大幅降低错误率。
至于示例。
# 源目录
SOURCE_DIR="/home/user/source_dir"
# 目标目录
DEST_DIR="/home/user/destination_dir"
2. 选用 rsync:最快速、最安全的同步工具
rsync 能递归复制并保持权限、时间戳等属性,同时支持压缩传输,极大提高大文件或网络慢的迁移效率。老实说,
-
-a: 归档模式。递归并保持属性, -
-v: 详细模式,实时显示进度。其实, -
-z: 压缩数据。适合带宽受限环境,
安装 rsync
sudo yum install -y rsync
基本语法与脚本化示例
#!/bin/bash
# 定义源、目标方法
SOURCE_DIR="/path/to/source/dir"
DEST_DIR="/path/to/destination/dir"
# 创建目标目录
mkdir -p "$DEST_DIR"
# 执行迁移
rsync -avz "$SOURCE_DIR"/ "$DEST_DIR"
echo "文件迁移完成!"
保存脚本为 migrate.sh 并赋予执行权限:
chmod +x migrate.sh
./migrate.sh
典型痛点 & 对策:
-
大量小文件慢吞吞传输:开启压缩(
-z) 或使用多线程 rsync 并行分片。 - 网络中断导致重传浪费时间:rsync 会自动跳过已完整复制的部分,可断点续传。按理说,
- 权限丢失导致后续程序报错:使用
3. 用 find + mv 做精细化筛选迁移
当你只想搬动特定类型或修改时间内的文件时find 与 mv 是最直观的组合。
# 示例:将所有 .txt 文件移动到目标目录
find /home/user/source_dir -type f -name "*.txt" -exec mv {} /home/user/destination_dir \;
-
-type f: 查找普通文件。 -
-name "*.txt": 指定后缀名过滤。 - –exec mv {} …,: 对每个匹配项执行 mv 命令。
痛点提示的观点是。在使用 mv 时要注意避免覆盖已有同名文件,可加上判断逻辑或使用 `mv -n` 防止覆盖。
4. 用 C 调用 readdir 实现自定义迁移流程
如果你需要更细粒度的控制,例如按
名、大小、修改时间做自定义过滤,并实时记录日志。那么可以直接在 C 程序中调用 POSIX 的 `
#include
#include
#include
#include
#include
int main {
if {
fprintf;
exit,}
const char *src = argv;老实说,const char *dst = argv;DIR *dp = opendir;if { perror,exit;}
struct dirent *entry;while ),= NULL) {
// 跳过 . 和 ..
if ||!strcmp)
continue;不过,// 构造完整方法
char src_path,dst_path;snprintf,"%s/%s",src,entry->d_name);snprintf,"%s/%s",dst,entry->d_name);// 简单演示:只移动 .txt 文件
if ) {
if == -1) {
perror;} else {
printf;老实说,}
}
}
closedir;return 0,说起来,}
至于优点。完全自定义过滤规则,不过,缺点:需要编译并手动处理错误。老实说,适合对性能有极致要求且熟悉 C 的使用者。
5. 自动化脚本包装
Amazing!当你把上述步骤封装成一个脚本后还可以利用 cron 定时执行,实现全自动备份与同步。
* */24 * * * /usr/local/bin/migrate.sh>> /var/log/migrate.log 2>&1
说到痛点回顾。
- “手工拖拽慢且易出错” → 使用 rsync + find 可以批量且精准搬运.
- “网络波动导致中途失败” → rsync 支持断点续传.
- “权限或符号链接丢失” → 加上 --perms --owner --group 参数.
- “想做更复杂的数据筛选” → 写脚本结合 find 或自行实现 readdir.
- “想要完全自动化” → 用 cron + 脚本无须人工干预.
P.S.的观点是,若你还有其它特殊需求,如跨磁盘复制、增量备份或者多线程并行,请随时补充,我可以帮你进一步调整脚本!
在进行文件迁移之前,先说说需要明确源目录和目标目录。
1. 先确定好源目录与目标目录
很多同学在开始迁移时会出现“忘记指定目标方法导致文件丢失”或“误删源文件”的痛点。提前把两条方法写清楚,能大幅降低错误率。
至于示例。
# 源目录
SOURCE_DIR="/home/user/source_dir"
# 目标目录
DEST_DIR="/home/user/destination_dir"
2. 选用 rsync:最快速、最安全的同步工具
rsync 能递归复制并保持权限、时间戳等属性,同时支持压缩传输,极大提高大文件或网络慢的迁移效率。老实说,
-
-a: 归档模式。递归并保持属性, -
-v: 详细模式,实时显示进度。其实, -
-z: 压缩数据。适合带宽受限环境,
安装 rsync
sudo yum install -y rsync
基本语法与脚本化示例
#!/bin/bash
# 定义源、目标方法
SOURCE_DIR="/path/to/source/dir"
DEST_DIR="/path/to/destination/dir"
# 创建目标目录
mkdir -p "$DEST_DIR"
# 执行迁移
rsync -avz "$SOURCE_DIR"/ "$DEST_DIR"
echo "文件迁移完成!"
保存脚本为 migrate.sh 并赋予执行权限:
chmod +x migrate.sh
./migrate.sh
典型痛点 & 对策:
-
大量小文件慢吞吞传输:开启压缩(
-z) 或使用多线程 rsync 并行分片。 - 网络中断导致重传浪费时间:rsync 会自动跳过已完整复制的部分,可断点续传。按理说,
- 权限丢失导致后续程序报错:使用
3. 用 find + mv 做精细化筛选迁移
当你只想搬动特定类型或修改时间内的文件时find 与 mv 是最直观的组合。
# 示例:将所有 .txt 文件移动到目标目录
find /home/user/source_dir -type f -name "*.txt" -exec mv {} /home/user/destination_dir \;
-
-type f: 查找普通文件。 -
-name "*.txt": 指定后缀名过滤。 - –exec mv {} …,: 对每个匹配项执行 mv 命令。
痛点提示的观点是。在使用 mv 时要注意避免覆盖已有同名文件,可加上判断逻辑或使用 `mv -n` 防止覆盖。
4. 用 C 调用 readdir 实现自定义迁移流程
如果你需要更细粒度的控制,例如按
名、大小、修改时间做自定义过滤,并实时记录日志。那么可以直接在 C 程序中调用 POSIX 的 `
#include
#include
#include
#include
#include
int main {
if {
fprintf;
exit,}
const char *src = argv;老实说,const char *dst = argv;DIR *dp = opendir;if { perror,exit;}
struct dirent *entry;while ),= NULL) {
// 跳过 . 和 ..
if ||!strcmp)
continue;不过,// 构造完整方法
char src_path,dst_path;snprintf,"%s/%s",src,entry->d_name);snprintf,"%s/%s",dst,entry->d_name);// 简单演示:只移动 .txt 文件
if ) {
if == -1) {
perror;} else {
printf;老实说,}
}
}
closedir;return 0,说起来,}
至于优点。完全自定义过滤规则,不过,缺点:需要编译并手动处理错误。老实说,适合对性能有极致要求且熟悉 C 的使用者。
5. 自动化脚本包装
Amazing!当你把上述步骤封装成一个脚本后还可以利用 cron 定时执行,实现全自动备份与同步。
* */24 * * * /usr/local/bin/migrate.sh>> /var/log/migrate.log 2>&1
说到痛点回顾。
- “手工拖拽慢且易出错” → 使用 rsync + find 可以批量且精准搬运.
- “网络波动导致中途失败” → rsync 支持断点续传.
- “权限或符号链接丢失” → 加上 --perms --owner --group 参数.
- “想做更复杂的数据筛选” → 写脚本结合 find 或自行实现 readdir.
- “想要完全自动化” → 用 cron + 脚本无须人工干预.
P.S.的观点是,若你还有其它特殊需求,如跨磁盘复制、增量备份或者多线程并行,请随时补充,我可以帮你进一步调整脚本!

