【问题标题】:shell : How to copy recursively also filenames that have specialcharshell:如何递归地复制具有特殊字符的文件名
【发布时间】: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 -rrsync 或其他不太复杂的工具来备份这些文件?我已经搜索并找不到:-/

这可能与我的操作系统安装问题有关,而不是与 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


【解决方案1】:

我发现 cp 名称中带有 specialchar 的文件的唯一方法是将它们复制到 EXT4 分区而不是 NTFS。

所以我减少了 NTFS 外部 HD 分区(它需要整个晚上才能这样做),在备用空间中创建了一个 EXT4 分区(标记为“EXT4ELEM”)并用它来备份我的文件:没有更多错误。

« cp "#:'ENE" /media/jluc/EXT4ELEM » 没问题。

(在这里找到灵感:Permissions for external HDD nextcloud container

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-27
    • 2014-07-08
    • 2018-02-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2019-10-13
    相关资源
    最近更新 更多