Ruby无法统计带有磅/哈希字符的文件



看:

bear@ptah:~/Pictures/Wallpapers
$ stat /home/bear/Dropbox/.#NineFoxes.org
File: /home/bear/Dropbox/.#NineFoxes.org -> polar@fennec.3781:1659418908
Size: 28              Blocks: 0          IO Block: 4096   symbolic link
Device: 10306h/66310d   Inode: 57016400    Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/    bear)   Gid: ( 1000/    bear)
Access: 2022-09-23 12:31:49.280214712 -0700
Modify: 2022-08-07 22:25:24.000000000 -0700
Change: 2022-09-23 12:31:49.532216732 -0700
Birth: 2022-09-23 12:31:49.280214712 -0700
bear@ptah:~/Pictures/Wallpapers
$ stat /home/bear/Dropbox/foo.log
File: /home/bear/Dropbox/foo.log
Size: 1471            Blocks: 8          IO Block: 4096   regular file
Device: 10306h/66310d   Inode: 57016411    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    bear)   Gid: ( 1000/    bear)
Access: 2022-09-23 12:31:49.280214712 -0700
Modify: 2022-09-10 23:28:04.000000000 -0700
Change: 2022-09-23 12:31:50.116221410 -0700
Birth: 2022-09-23 12:31:49.280214712 -0700
bear@ptah:~/Pictures/Wallpapers
$ irb
irb(main):001:0> File.stat '/home/bear/Dropbox/foo.log'
=> #<File::Stat dev=0x10306, ino=57016411, mode=0100644, nlink=1, uid=1000, gid=1000, rdev=0x0, size=1471, blksize=4096, blocks=8, atime=2022-09-23 12:31:49.280214712 -0700, mtime=2022-09-10 23:28:04 -0700, ctime=2022-09-23 12:31:50.11622141 -0700>
irb(main):002:0> File.stat '/home/bear/Dropbox/.#NineFoxes.org'
Traceback (most recent call last):
5: from /usr/bin/irb:23:in `<main>'
4: from /usr/bin/irb:23:in `load'
3: from /usr/lib/ruby/gems/2.7.0/gems/irb-1.2.6/exe/irb:11:in `<top (required)>'
2: from (irb):2
1: from (irb):2:in `stat'
Errno::ENOENT (No such file or directory @ rb_file_s_stat - /home/bear/Dropbox/.#NineFoxes.org)
irb(main):003:0> 

文件名完全正确;这就是文件,Ruby无法对其进行统计。Linux可以,其他一切都可以。Ruby也可以统计一个没有散列的文件。需要什么才能使这个文件对Ruby可用?(不,重命名不是一个选项;我需要统计文件。(

注意:这也是Dir.glob找到的文件名。这是Ruby认为它拥有的文件名。

irb(main):003:0> x = Dir.glob('Dropbox/*.org', File::FNM_DOTMATCH)
=> ["Dropbox/NineFoxes.org", "Dropbox/.#NineFoxes.org", "Dropbox/Elf.org", "Dropbox/Midra.org"]
irb(main):004:0> File.stat(x[0])
=> #<File::Stat dev=0x10306, ino=57016406, mode=0100744, nlink=1, uid=1000, gid=1000, rdev=0x0, size=38102, blksize=4096, blocks=80, atime=2022-09-23 12:31:49.280214712 -0700, mtime=2022-07-29 22:00:02 -0700, ctime=2022-09-23 12:31:50.11622141 -0700>
irb(main):005:0> File.stat(x[1])
Traceback (most recent call last):
5: from /usr/bin/irb:23:in `<main>'
4: from /usr/bin/irb:23:in `load'
3: from /usr/lib/ruby/gems/2.7.0/gems/irb-1.2.6/exe/irb:11:in `<top (required)>'
2: from (irb):5
1: from (irb):5:in `stat'
Errno::ENOENT (No such file or directory @ rb_file_s_stat - Dropbox/.#NineFoxes.org)
irb(main):006:0> File.stat(x[2])
=> #<File::Stat dev=0x10306, ino=57016408, mode=0100644, nlink=1, uid=1000, gid=1000, rdev=0x0, size=8416, blksize=4096, blocks=24, atime=2022-09-23 12:31:49.280214712 -0700, mtime=2022-09-19 18:08:32 -0700, ctime=2022-09-23 12:31:50.120221442 -0700>
irb(main):007:0> 

附加:这是Linux,MX Linux 21,ruby 2.7.4p191(2021-07-07修订版a21a3b7d23([x86_64-Linux-gnu]。外壳是Bash。

File.stat只调用File::Stat.new,如果文件不存在,则会引发异常;这就是你所看到的行为。

请注意,/home/bear/Dropbox/.#NineFoxes.org是一个符号链接(请参阅stat输出中的Access: 0777/lrwxrwxrwx(。Ruby的File.stat文档没有说明它是否遵循符号链接,但File.lstat说:

File::stat相同,但不跟随最后一个符号链接。相反,报告链接本身。

因此暗示File.stat将跟随符号链接并统计它指向的内容。

所以/home/bear/Dropbox/.#NineFoxes.org符号链接确实存在,但符号链接引用的内容并不存在。

最新更新