【发布时间】:2020-11-16 08:27:16
【问题描述】:
我在 ubuntu 20.04 上使用一个简单的脚本来备份外部磁盘上的重要文件夹:
#!/usr/bin/env bash
cp -r /PROFILE PROFILE
cp -r /media/DATA DATA
除了一些文件名包含特殊字符的文件外,它工作正常:# | ?和'
- :每次屏幕截图(日期时间)和保存电子邮件答案(“回复:”)时都会发生
- '#' 出现在每个录制的声音中(“title #12”)
- ', |和 ?主要发生在保存的 html 或电子邮件中
- 有时还会出现“*”(星号)和“
- 还有当文件名的最后一个字符有空格时
错误是“无法创建标准文件'./DATA/Re: blahblah': Invalid argument”(翻译自法语错误消息)。并且所述文件没有被复制。
当我使用 rsync -avrq 时,相同的文件名也会产生错误并且不会被复制,但是 rsync 在错误上会更加冗长:
- 对于“|”和 ':' 文件或文件夹名中的字符 rsync 问题:«
rsync: recv_generator: mkdir "/destinationfolder/filename with | or : " failed: Invalid argument (22)» - 对于其他字符,rsync 发出一个普通的:«
rsync: mkstemp "/destinationfolder/.filename with : inside.eml.UeByTF" failed: Invalid argument (22)» - 在这两种情况下,它都会在包含文件夹的末尾发出 «
*** Skipping any contents from this failed directory ***»
我曾经有过(我认为没有“安静”选项)这个细节:«rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1207) [sender=3.1.3]»
如何更好地使用cp -r 或rsync 或其他不太复杂的工具来备份这些文件?我已经搜索并找不到:-/
这可能与我的操作系统安装问题有关,而不是与 cp 或 rsync 使用有关吗?此 UBuntu 20.04 已从 18.04 升级并有时进行了调整。
[编辑] 目标外部 HD 分区是 NTFS(如 gparted)或“保险丝”(如 Nautilus / Properties)。我在 Permissions for external HDD nextcloud container 上看到,将其更改为 ext4 可以解决 (code 23) at main.c(1207) [sender=3.1.3] 问题。
[EDIT] 看起来 rsync 使用带有 '.' 的临时文件前缀,有时问题出在此文件上,有时也会在将此文件移动到最终目标文件(不带 .)时发生:
rsync: rename "/media/jluc/My Passport/SAVRSYNC/logo/.rubon1.ZpK66N" -> "logo/rubon1.": Invalid argument (22)
【问题讨论】:
-
shellcheck.net 是你的朋友。
-
shellcheck 建议包含 shebang,所以我在代码示例中这样做了。就是这样(“未检测到问题”)
-
@JLuc :我看不出你的脚本在哪些方面应该对这些文件名有问题。您实际上注意到这些文件有什么影响?
-
@user1934428 错误信息是“cp: cannot create standard file './DATA/Re: blahblah.eml': Invalid argument”(翻译自法语错误信息 « cp: possible de créer le fichier standard './DATA/Re: blahblah.eml': Argument invalide »)
-
该命令是否适用于其他文件(即那些没有“冒犯”字符的文件)?如果将
cp替换为rsync会发生什么?cp --version说什么?
标签: shell copy special-characters filenames cp