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

shell : How to copy recursively also filenames that have specialchar

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

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

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

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

当我使用 rsync -avrq 时,相同的文件名也会产生错误并且不会被复制,但是 rsync 在错误方面更详细一些:

我曾经有过(我认为没有“安静”选项)这个细节:« rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1207) [sender=3.1.3] »

如何更好地使用 cp -rrsync 或其他不太复杂的工具来备份这些文件?我已经搜索过但找不到 :-/

这是否与我的 OS 安装问题有关,而不是与 cp 或 rsync 使用有关?此 UBuntu 20.04 已从 18.04 升级并进行了一些调整。

[编辑] 目标外部 HD 分区是 NTFS(gparted)或“fuse”(Nautilus / Properties)。我在 Permissions for external HDD nextcloud container 上看到将其更改为 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)

我发现在文件名中使用 specialchar 的唯一方法是将它们复制到 EXT4 分区而不是 NTFS。

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

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

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