我想将大量文件复制到格式化为 FAT32 的 USB 驱动器(不幸的是,无法格式化为其他格式)。
其中许多文件的名称中含有FAT32 不允许的字符,如:
和。?
尝试使用cp
或 时rsync
,这些文件不会被复制,并且会报告错误,说明这一点。
我不想在源处重命名文件,但我也不关心目标 USB 驱动器上的文件被重命名为什么。
目的澄清(也适用于其他评论):这是用于汽车中的 mp3 播放器,并且该软件仅允许 FAT32。所以它不是用于备份目的。文件名具有奇怪字符的原因是因为它们是,例如 mp3 的标题或艺术家的名字。
我尝试了几件事:
- rsync 的
--iconv
选项。这似乎不起作用,但也许我没有正确使用它。 rdiff-backup
,我读到的默认情况下会进行此转换。但是,源文件是我想要遵循的符号链接(即 rsync 的-L
选项),并且从联机帮助页来看似乎没有rdiff-backup
此选项。
还有其他建议吗?
答案1
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
该脚本在 zsh 下运行,稍作修改:替换shopt -s dotglob globstar
为setopt dot_glob
和[[ $target -ot $source ]]
by [[ ! -e $target || $target -ot $source ]]
。
答案2
如果是出于备份目的,只需保存一个 tarball 即可。这样就没有文件名的麻烦了。