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
它工作正常,除了一些文件名包含特殊字符的文件:# | ?和'
- :发生在每次屏幕截图(日期时间)和保存电子邮件回复时(“Re:”)
- 每个录制的声音都会出现“#”(“title #12”)
- ', |和 ?主要发生在已保存的 html 或电子邮件
中
- 有时还会出现“*”(星号)和“<”
- 还有当 space 作为文件名的最后一个字符时
错误是“无法创建标准文件'。/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
或其他不太复杂的工具来备份这些文件?我已经搜索过但找不到 :-/
这是否与我的 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)
我在 ubuntu 20.04 上使用一个简单的脚本来备份外部磁盘上的重要文件夹:
#!/usr/bin/env bash
cp -r /PROFILE PROFILE
cp -r /media/DATA DATA
它工作正常,除了一些文件名包含特殊字符的文件:# | ?和'
- :发生在每次屏幕截图(日期时间)和保存电子邮件回复时(“Re:”)
- 每个录制的声音都会出现“#”(“title #12”)
- ', |和 ?主要发生在已保存的 html 或电子邮件 中
- 有时还会出现“*”(星号)和“<”
- 还有当 space 作为文件名的最后一个字符时
错误是“无法创建标准文件'。/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
或其他不太复杂的工具来备份这些文件?我已经搜索过但找不到 :-/
这是否与我的 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)