![从USB设备复制到HDD的文件名全部变成大写。如何修复它?](https://linux22.com/image/41392/%E4%BB%8EUSB%E8%AE%BE%E5%A4%87%E5%A4%8D%E5%88%B6%E5%88%B0HDD%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%E5%85%A8%E9%83%A8%E5%8F%98%E6%88%90%E5%A4%A7%E5%86%99%E3%80%82%E5%A6%82%E4%BD%95%E4%BF%AE%E5%A4%8D%E5%AE%83%EF%BC%9F.png)
我目前使用的是 OpenBSD 5.5 版本。
每当我将文件或目录从 USB 设备复制到本地硬盘时,复制的文件名都变成大写。
是什么原因造成的?
我如何解决它?
答案1
您提到您正在使用 FAT32 文件系统。 FAT 和 NTFS 都是不区分大小写的文件系统。我假设驱动程序只使用大写字母来确保目录中不存在 >1 个具有相同名称的文件(尽管大小写不同)。
您描述的问题已经存在一段时间了。看这个线程例如从 2008 年开始。
我建议在 FAT/NFTS 驱动器上使用不同的 FS 或使用 TAR 存档来保留大小写。
答案2
您可以使用以下命令修复它(每次发生时):
find local_directory_name -depth -exec sh -c 'dir="$(dirname "$0")"; FILE="$(basename "$0")"; lowfile="$(echo "$FILE" | tr "A-Z" "a-z")"; if [ "$lowfile" != "$FILE" ]; then mv "$0" "$dir/$lowfile"; fi' {} ";"
将所有内容键入一行(替换local_directory_name
为您将文件复制到的目录的名称)。您可以通过插入反斜杠将其分成多行。或者您可以将后面的部分放入sh -c
脚本文件中。
这会枚举目录中的所有文件(包括子目录,递归地)并对每个文件执行给定的命令。
-depth
使其“自下而上”工作,因此它在处理(重命名)目录本身之前处理目录中的所有条目。每个文件名(从以下位置开始的相对路径)本地目录名称)被分解为目录部分和普通文件名(只是底部组件)。然后文件名从大写转换为小写。如果这与现有文件名不同,则会将文件重命名为小写名称。我添加此检查是为了防止您因尝试将文件重命名为自身而收到诊断消息,如果您的文件名称不包含字母(即仅包含数字和特殊字符),则会发生这种情况。或者,就此而言,如果您有一个名称不包含任何内容的文件首都字母。
事后想法:避免错误的另一种方法是在之后mv 123 123
添加,它告诉只处理至少包含一个大写字母的名称。-name "*[A-Z]*"
-depth
find