lstat に与えるシンボリックリンク名の末尾にスラッシュ「/」をつけるとシンボリックリンクを辿るらしい

公開:2021/01/19
更新:2021/01/19
3 min読了の目安(約2700字TECH技術記事

Python の os.lstat です。 os.lstat はシステムコールの lstat を呼びます。

os.lstat(path, *, dir_fd=None)

Perform the equivalent of an lstat() system call on the given path. Similar to stat(), but does not follow symbolic links. Return a stat_result object.

シンボリックリンクは辿らないと書いてあるのに

環境

  • Arch Linux x86_64
  • Python 3.9.1
% uname -rsm
Linux 5.10.7-arch1-1 x86_64
% python --version
Python 3.9.1

ディレクトリ b へのシンボリックリンク b.symlink があるとして

% ls -l a/
合計 4
drwxr-xr-x 2 miwa docker 4096  119 14:19 b
lrwxrwxrwx 1 miwa docker    1  119 14:19 b.symlink -> b

lstat にシンボリックリンクを与えるとシンボリックリンク自体の情報を返す

>>> os.lstat('a/b.symlink')
os.stat_result(st_mode=41471, st_ino=7999734, st_dev=65024, st_nlink=1, st_uid=1337, st_gid=973, st_size=1, st_atime=1611033568, st_mtime=1611033560, st_ctime=1611033560)

末尾にスラッシュ / を付けるとシンボリックリンクを辿る。

>>> os.lstat('a/b.symlink/')
os.stat_result(st_mode=16877, st_ino=7999733, st_dev=65024, st_nlink=2, st_uid=1337, st_gid=973, st_size=4096, st_atime=1611033546, st_mtime=1611033546, st_ctime=1611033546)

上記の結果はリンク先のディレクトリを与えた場合と同じ結果。inode (st_ino) も同じ。

>>> os.lstat('a/b')
os.stat_result(st_mode=16877, st_ino=7999733, st_dev=65024, st_nlink=2, st_uid=1337, st_gid=973, st_size=4096, st_atime=1611033546, st_mtime=1611033546, st_ctime=1611033546)

なお stat コマンドでも同じ挙動となる。

シンボリックリンクを与える

% stat a/b.symlink 
  File: a/b.symlink -> b
  Size: 1               Blocks: 0          IO Block: 4096   シンボリックリンク
Device: fe00h/65024d    Inode: 7999734     Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1337/    miwa)   Gid: (  973/  docker)
Access: 2021-01-19 14:19:28.141464184 +0900
Modify: 2021-01-19 14:19:20.764913179 +0900
Change: 2021-01-19 14:19:20.764913179 +0900
 Birth: 2021-01-19 14:19:20.764913179 +0900

末尾にスラッシュ / を付ける。

% stat a/b.symlink/
  File: a/b.symlink/
  Size: 4096            Blocks: 8          IO Block: 4096   ディレクトリ
Device: fe00h/65024d    Inode: 7999733     Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 1337/    miwa)   Gid: (  973/  docker)
Access: 2021-01-19 14:19:06.125142673 +0900
Modify: 2021-01-19 14:19:06.125142673 +0900
Change: 2021-01-19 14:19:06.125142673 +0900
 Birth: 2021-01-19 14:19:06.125142673 +0900

上記の結果はリンク先のディレクトリの結果と同じ。 inode も同じ。

% stat a/b
  File: a/b
  Size: 4096            Blocks: 8          IO Block: 4096   ディレクトリ
Device: fe00h/65024d    Inode: 7999733     Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 1337/    miwa)   Gid: (  973/  docker)
Access: 2021-01-19 14:19:06.125142673 +0900
Modify: 2021-01-19 14:19:06.125142673 +0900
Change: 2021-01-19 14:19:06.125142673 +0900
 Birth: 2021-01-19 14:19:06.125142673 +0900