我想将大量文件复制到格式化为 FAT32 的 USB 驱动器(不幸的是,不能格式化任何其他文件)。
大部分这些文件与字符,如名称:和?该FAT32不允许。尝试使用cp或 时rsync,不会复制这些文件并报告错误说明。
我不想在源头重命名文件,但我也不关心文件在目标 USB 驱动器上重命名为什么。
目的说明(也适用于其他评论):这是用于汽车中的 mp3 播放器,该软件仅允许 FAT32。所以它不是用于备份目的。文件名包含奇怪字符的原因是因为它们是,例如 mp3 的标题或艺术家的名字。
我尝试了几件事:
--iconv选项。这似乎不起作用,但也许我没有正确使用它。rdiff-backup,我读过的默认情况下会进行此转换。但是,源文件是我想要遵循的符号链接(即 rsync 的-L选项),并且从联机帮助页中似乎rdiff-backup没有此选项。还有其他建议吗?
Rsync with--iconv是一个选项,但您首先需要定义一种编码,其中?,:和其他编码使用 FAT 文件系统上允许的字符。
对于您的用例,您没有为此使用 rsync 的所有功能。这个任务可以通过几行 shell 脚本完成。
这是一个 bash 脚本,它复制~/Music到/media/usb99,跳过目标上较旧的文件,并将:和转换?为_。它不会检测冲突(我假设你没有同时使用foo:bar.mp3和foo?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 globstar为setopt dot_glob和[[ $target -ot $source ]]by [[ ! -e $target || $target -ot $source ]]。