linux - 在 Linux/OSX/BSD/Solaris 上的不区分大小写的文件系统上获取真实文件名大小写
问题描述
我正在寻找一种方法来在所有 Unix 衍生产品上的一个保留大小写、不区分大小写的文件系统上查找文件名的真实大小写。
在 Windows 上,您有 FindFirstFile。
我可以在 OSX 上看到 fnctl 的 F_GETPATH 变体,但我不确定这是否符合我的要求(我没有办法测试它)。
到目前为止我所做的研究:
- stat syscall 似乎返回了给 stat 调用的任何内容
- 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 确实返回了文件的真实情况,但它这样做是因为它递归地列出了每个目录的子目录,直到文件存储的位置。
这对于位于有许多孩子的目录中的深层嵌套项目来说会很昂贵,因此我正在寻找一种更便宜的方法来做到这一点。
理想情况下,给定文件描述符或可能有错误大小写的路径,可以返回“存储”大小写的东西。
解决方案
推荐阅读
- sql-server - 消除 SQL Server 上冗余唯一索引的唯一性是否有好处?
- excel - 在大型工作簿中单独循环遍历每一列
- linux - 计算字数并指定行数
- sorting - 为什么合并打印顺序相反
- r - 来自 geom_abline 的自定义 +/- 10% 波段?
- firebase - Flutter firestore 获取具有地图字段条件的文档
- io - 如何在fortran中直接将4字节数据读入8字节变量?
- c# - C# TcpClient 无法连接到简单的 python TCPIP 侦听器连接被拒绝,即使 docker 实例可以通信
- python - QThread导致整个程序在pyqt5中休眠
- java - 动态访问用户提供的类的用户提供的属性的有效/最佳方法是什么?