shell:如何递归复制具有特殊字符的文件名

问题描述 投票:0回答:1

我在 ubuntu 20.04 上使用一个简单的脚本来备份外部磁盘上的重要文件夹:

    #!/usr/bin/env bash
    cp -r  /PROFILE PROFILE
    cp -r /media/DATA DATA

它工作正常,除了一些文件名包含特殊字符的文件:# | ?和 '

  • :每次屏幕截图(日期时间)和保存电子邮件答案时都会发生(“回复:”)
  • 每个录制的声音都会出现“#”(“标题 #12”)
  • ', |和 ?主要出现在保存的 html 或电子邮件中
  • 还有“*”(星号)和“<' sometimes happen
  • 当文件名的最后一个字符有空格时

错误是“无法创建标准文件'./DATA/Re: blahblah':参数无效”(翻译自法语错误消息)。并且该文件未被复制。

当我使用

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)或“fuse”(表示 Nautilus / Properties)。我在外部 HDD nextcloud 容器的权限上看到将其更改为 ext4 可以解决

(code 23) at main.c(1207) [sender=3.1.3]
问题。

[编辑] 看起来 rsync 使用带有“.”的临时文件前缀,有时问题出在该文件上,有时将此文件移动到最终目标文件(不带 .)时也会发生这种情况:

rsync: rename "/media/jluc/My Passport/SAVRSYNC/logo/.rubon1.ZpK66N" -> "logo/rubon1.": Invalid argument (22)

shell copy special-characters filenames cp
1个回答
0
投票

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

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

« cp "#:<>'ENE" /media/jluc/EXT4ELEM » 就可以了。

(灵感在这里找到:外部 HDD nextcloud 容器的权限

© www.soinside.com 2019 - 2024. All rights reserved.