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

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

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

其中许多文件的名称中含有FAT32 不允许的字符,如:和。?尝试使用cp或 时rsync,这些文件不会被复制,并且会报告错误,说明这一点。

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

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

我尝试了几件事:

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

还有其他建议吗?

答案1

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

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

答案2

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

相关内容