0

0

rsync 同步报 "some files could not be transferred" 的权限/时间戳坑

舞夢輝影

舞夢輝影

发布时间:2026-01-26 20:14:02

|

497人浏览过

|

来源于php中文网

原创

rsync报“some files could not be transferred”是因权限、时间戳等元数据操作失败导致的非零退出码,具体错误需通过重定向stderr或使用-i/--itemize-changes定位;常见原因包括NFS/Docker卷不支持utimensat()、挂载限制、ACL/UID不匹配等,应针对性禁用--times/--perms或调整挂载参数。

rsync 同步报 \

rsync 报 “some files could not be transferred” 却没说具体哪个文件失败

这是 rsync 的默认静默行为:只要任意一个文件因权限、只读挂载、时间戳设置失败等原因跳过,它就返回非零退出码并输出这句笼统提示,--verbose 也不一定显示细节。真正有用的线索藏在 stderr 里,但默认被忽略或混在大量输出中。

实操建议:

  • -v(或 --verbose)是基础,但还不够;必须重定向 stderr 才能看到真实错误,例如:rsync -av src/ dst/ 2>&1 | grep -E "(Permission denied|Operation not permitted|Failed to set times)"
  • --itemize-changes(简写 -i)能逐文件标出哪些属性同步失败(比如 .f……. 表示时间戳没设上,.p……. 表示权限没改成功)
  • 若目标是 NFS 或某些容器卷,--omit-dir-times--no-perms 可先绕过问题定位主因

“Operation not permitted” 设置时间戳失败的常见场景

这不是 rsync 本身的问题,而是目标文件系统不支持 utimensat() 或内核禁止普通用户修改 mtime/ctime。典型环境包括:Docker volume、rootless Podman、某些挂载参数的 NFS、以及 macOS 上通过 SMB 挂载的共享目录。

实操建议:

  • 确认是否真需要精确时间戳:--times(默认启用)可改为 --no-times;若只需保留源文件的修改时间做参考,用 --copy-dest + --ignore-times 更稳妥
  • 若必须保留时间戳,检查目标挂载选项:NFS 需含 noac 或服务端开启 no_wdelay;Linux 上可临时测试 touch -d @$(stat -c '%Y' somefile) /path/to/test 看是否报错
  • 避免在 rsync 命令里混用 --archive(隐含 --times)和手动加 --no-times,优先用显式开关控制

Permission denied 写入或 chmod 失败的根源判断

rsync 默认尝试还原源文件的权限(--perms),但目标位置可能:① 文件系统挂载为 noexec,nosuid,nodevro;② 目标目录 sticky bit 或 ACL 限制了 chmod;③ 源文件属主 UID 在目标机器不存在,导致 chown 失败(即使你没加 --owner--archive 也会触发)。

微信 WeLM
微信 WeLM

WeLM不是一个直接的对话机器人,而是一个补全用户输入信息的生成模型。

下载

实操建议:

  • ls -ld /target/dir 确认挂载参数和目录权限;mount | grep $(df . | tail -1 | awk '{print $1}') 查看实际挂载选项
  • 明确关闭不需要的操作:--no-perms(跳过 chmod)、--no-owner(跳过 chown)、--no-group(跳过 chgrp)
  • 若需保留权限但目标不支持完整模式(如 FAT32),可用 --chmod=ugo=rwX 统一修正,而非依赖源文件原始 mode

为什么加了 --force 还是报错?

--force 只影响“删除目标上存在但源没有的文件”,跟权限或时间戳失败完全无关。很多人误以为它能强制覆盖权限限制,其实不能。真正相关的是 --ignore-errors——但它会让 rsync 忽略所有错误(包括磁盘满、网络断开),风险极大,不推荐用于生产同步。

更安全的做法:

  • 分两步走:先用 rsync -av --no-times --no-perms src/ dst/ 完成内容同步;再单独用 find dst/ -type f -exec touch -r {} {} \; 2>/dev/null 批量更新时间戳(仅限需要时)
  • 对关键任务,用 rsync --dry-run-i 预检,比硬着头皮跑完再查日志高效得多
  • 如果目标是远程服务器且你有 sudo 权限,考虑用 --rsync-path="sudo rsync",但务必确认远端 sudoers 允许无密码执行 rsync

最常被忽略的一点:rsync 的 exit code 是累计值——哪怕只有 1 个文件时间戳没设上,它也返回 24;而很多自动化脚本只检查 0/非0,根本意识不到“同步完成但部分元数据丢失”。别只看成功与否,得看 rsync 到底改了什么、没改什么。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

186

2023.09.27

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

235

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

437

2024.03.01

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

235

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

437

2024.03.01

k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

257

2023.07.24

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

497

2024.04.08

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

401

2024.04.08

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

31

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.8万人学习

Git 教程
Git 教程

共21课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号