将带有特殊字符的文件同步到 USB FAT32

ato*_*sky 8 backup rsync fat

我想将大量文件复制到格式化为 FAT32 的 USB 驱动器(不幸的是,不能格式化任何其他文件)。

大部分这些文件与字符,如名称:?该FAT32不允许。尝试使用cp或 时rsync,不会复制这些文件并报告错误说明。

我不想在源头重命名文件,但我也不关心文件在目标 USB 驱动器上重命名为什么。

目的说明(也适用于其他评论):这是用于汽车中的 mp3 播放器,该软件仅允许 FAT32。所以它不是用于备份目的。文件名包含奇怪字符的原因是因为它们是,例如 mp3 的标题或艺术家的名字。

我尝试了几件事:

  1. rsync 的--iconv选项。这似乎不起作用,但也许我没有正确使用它。
  2. rdiff-backup,我读过的默认情况下会进行此转换。但是,源文件是我想要遵循的符号链接(即 rsync 的-L选项),并且从联机帮助页中似乎rdiff-backup没有此选项。

还有其他建议吗?

Gil*_*il' 6

Rsync with--iconv是一个选项,但您首先需要定义一种编码,其中?,:和其他编码使用 FAT 文件系统上允许的字符。

对于您的用例,您没有为此使用 rsync 的所有功能。这个任务可以通过几行 shell 脚本完成。

这是一个 bash 脚本,它复制~/Music/media/usb99,跳过目标上较旧的文件,并将:和转换?_。它不会检测冲突(我假设你没有同时使用foo:bar.mp3foo?bar.mp3)。

#!/bin/bash
set -e
shopt -s dotglob globstar
cd ~/Music
for source in **/*; do
  target=/media/usb99/${source#"$HOME"/}
  target=${target//[:?]/_}
  if [[ -d $source ]]; then
    mkdir -p -- "$target"
  elif [[ $target -ot $source ]]; then
    cp -p -- "$source" "$target"
  fi
done
Run Code Online (Sandbox Code Playgroud)

该脚本在 zsh 下运行,稍作修改:替换shopt -s dotglob globstarsetopt dot_glob[[ $target -ot $source ]]by [[ ! -e $target || $target -ot $source ]]


von*_*and 2

如果是出于备份目的,只需保存一个 tarball 即可。这样就没有文件名的麻烦了。

  • @atorgovitsky您应该编辑您的原始问题以提供这些详细信息。 (3认同)