首页 > 解决方案 > 在 Linux/OSX/BSD/Solaris 上的不区分大小写的文件系统上获取真实文件名大小写

问题描述

我正在寻找一种方法来在所有 Unix 衍生产品上的一个保留大小写、不区分大小写的文件系统上查找文件名的真实大小写。

在 Windows 上,您有 FindFirstFile。

我可以在 OSX 上看到 fnctl 的 F_GETPATH 变体,但我不确定这是否符合我的要求(我没有办法测试它)。

到目前为止我所做的研究:

  1. stat syscall 似乎返回了给 stat 调用的任何内容
  2. lsof 和 /proc 似乎将描述符解析回 fopen 系统调用中提供的描述符。

我知道这可以通过递归 readdir 来完成,但是对于具有 N 级的路径,这将是许多系统调用可能最终变得昂贵。

我正在寻找一种更便宜的方法来做到这一点。

这是一个例子来说明这种情况:

root@you:/mnt/fat32# mkdir -p Case/Sensitive
root@you:/mnt/fat32# touch Case/Sensitive/file
root@you:/mnt/fat32# stat case/sensitive/file
  File: case/sensitive/file
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 840h/2112d      Inode: 33          Links: 1
Access: (0777/-rwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-06-21 20:27:36.000000000 +0100
Modify: 2020-06-21 20:27:36.000000000 +0100
Change: 2020-06-21 20:27:36.000000000 +0100
 Birth: -

root@you:/mnt/fat32# find .
.
./Case
./Case/Sensitive
./Case/Sensitive/file

请注意,统计文件会返回输入大小写,而不是存储文件的大小写。

Find 确实返回了文件的真实情况,但它这样做是因为它递归地列出了每个目录的子目录,直到文件存储的位置。

这对于位于有许多孩子的目录中的深层嵌套项目来说会很昂贵,因此我正在寻找一种更便宜的方法来做到这一点。

理想情况下,给定文件描述符或可能有错误大小写的路径,可以返回“存储”大小写的东西。

标签: linuxunixfilesystems

解决方案


推荐阅读