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


8

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

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

我不想在源上重命名文件,但是我也不在乎将文件重命名为目标USB驱动器上的文件。

目的说明(同样适用于其他注释):这是针对汽车中的mp3播放器,并且该软件仅允许使用FAT32。因此,它不是出于备份目的。文件名具有奇怪字符的原因是因为它们是例如mp3的标题或艺术家的名字。

我尝试了几件事:

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

还有其他建议吗?


首先,为什么不能重新格式化USB驱动器?为什么文件名中带有冒号和问号?即使源驱动器上的文件系统允许使用这些字符,但它们对于shell工作和可移植性而言仍然存在问题。另外,对于您要使用rsync--iconv选项,不会为其提供选项。
2013年

1
@depquid,如果您编写有问题的shell代码,那么这只是shell工作的问题。
jordanm

@jordanm我在考虑更多有关交互式shell的使用。当然可以,但是恕我直言,使用更多标准字符会更方便。
2013年

1
仅供参考,进行--iconv字符集转换,例如latin1 <-> utf8。不是您要找的。
derobert

Answers:


4

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 ]]通过[[ ! -e $target || $target -ot $source ]]


2

如果是出于备份目的,则只需存放一个压缩包。这样就没有文件名麻烦了。


1
目的说明(同样适用于其他注释):这是针对汽车中的mp3播放器,并且该软件仅允许使用FAT32。因此,它不是出于备份目的。文件名具有奇怪字符的原因是因为它们是例如mp3的标题或艺术家的名字。
atorgovitsky

3
@atorgovitsky您应该编辑原始问题以提供这些详细信息。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.