Computer368106 views
高校倫理1440106 views
高校物理160203 views
数学講師2886227 views
小学算数1200427 views
教育149510 views
高校日本史190571 views
いろは3010814 views
中学英語811710 views
高校化学2924392 views
Help
Tools
NewsSpreadsheetCalendarSlidesTier ListPen ToolIllustrationCrayonPixel ArtASCII ArtPerspectiveEndless StairsGraphMind MapER DiagramFamily TreeMemeCurved TextImage EditorMosaicRetro FilterPencil SketchOCR/HighlighterMakeup EditorFaviconVideo TrimmerScrolling VideoVideo TitleColor PickerColor ExtractorBonfireFireworksWater RippleWater SplashBreaking GlassWood GrainMarble TextureCSS ButtonIcon MakerBar ChartGrouped Bar ChartStacked Bar ChartPie ChartLine ChartArea ChartStacked Area ChartScatter Plot3D Bar Chart3D Pie ChartBar Chart RaceBubble ChartPopulation PyramidPictogramEarningsCandlestick ChartInvestment RiskMortgage SimulatorCalculatorMatrix CalculatorFunction GraphPolynomial ExpansionVenn DiagramField VisualizerRubik's Cube Group TheoryTraveling SalesmanVoronoi and DelaunayFractalColumn ArithmeticDraw Math FiguresArithmetic AnimationArithmetic Word ProblemsCounting with Tree DiagramsCube NetsCross SectionsMotion PathMechanicsWavesLight and LensesThermodynamicsHow Semiconductors WorkMolecular StructuresAtomic OrbitalsElectrochemical CellsChemical EquilibriumCrystal LatticesBuffer pHComplex IonsDNA Double HelixCell DivisionMembrane ChannelsNerve ImpulseRock ClassificationWeatherConstellationsSolar and Lunar Eclipses3D ModelingFloor PlanSeismic StructuresIntersection TurnMaglevCooking AnimationOrigamiLive Viewer CountGeoJSON MapRailway MapPopulation MapCrime MapLand Price MapSchool MapShrine and Castle MapHouse of Representatives MapWord MapSolitaireReversiHakoiri MusumeChessHamburgerRippleSlide Puzzle MakerNeon PinballNovel MakerJapanese Typing PracticePiano Score EditorMusic Theory

English

Python でシンボリックリンクとハードリンクを扱う

シンボリックリンクとハードリンクは、1 つのファイルに複数の名前を付ける仕組みだ。Python ではどちらも作成・操作できる。

シンボリックリンクとハードリンクの違い

シンボリックリンク

ファイルの「パス」を指すショートカット。リンク先が削除されると壊れる(dangling link)。異なるファイルシステムを跨げる。ディレクトリにもリンクできる。

ハードリンク

同じ inode を共有する別名。どちらのリンクを削除しても、もう一方からアクセスできる。同じファイルシステム内でのみ作成可能。ディレクトリには作成できない。

シンボリックリンクを作成する

os.symlink() でシンボリックリンクを作成する。

import os

# target へのシンボリックリンクを link_name として作成
os.symlink('target.txt', 'link_to_target.txt')

pathlib でも同様に作成できる。

from pathlib import Path

Path('link_to_target.txt').symlink_to('target.txt')

ディレクトリへのシンボリックリンクを作成する場合は、target_is_directory=True を指定する(Windows で必要)。

os.symlink('mydir', 'link_to_dir', target_is_directory=True)

ハードリンクを作成する

os.link() でハードリンクを作成する。

import os

os.link('original.txt', 'hardlink.txt')

pathlib では link_to() を使う(Python 3.10 以降は hardlink_to())。

from pathlib import Path

# Python 3.10 以降
Path('hardlink.txt').hardlink_to('original.txt')

シンボリックリンクかどうかを判定する

import os
from pathlib import Path

# os.path
print(os.path.islink('link_to_target.txt'))  # True

# pathlib
print(Path('link_to_target.txt').is_symlink())  # True

シンボリックリンクの参照先を取得する

import os
from pathlib import Path

# os
target = os.readlink('link_to_target.txt')
print(target)  # target.txt

# pathlib
target = Path('link_to_target.txt').readlink()
print(target)  # target.txt

シンボリックリンクを解決する

resolve() はシンボリックリンクをたどって最終的なパスを返す。

from pathlib import Path

# link -> dir/file.txt の場合
real_path = Path('link').resolve()
print(real_path)  # /home/user/dir/file.txt

os.path.realpath() も同様だ。

import os

real_path = os.path.realpath('link')

リンクをたどらずに操作する

os.lstat() はシンボリックリンク自体の情報を返す(os.stat() はリンク先の情報を返す)。

import os

# リンク先の情報
stat_info = os.stat('link_to_target.txt')

# リンク自体の情報
lstat_info = os.lstat('link_to_target.txt')

ハードリンクの数を確認する

os.stat()st_nlink でハードリンクの数がわかる。

import os

nlinks = os.stat('original.txt').st_nlink
print(f'リンク数: {nlinks}')

通常のファイルは 1、ハードリンクを作成すると 2 以上になる。

壊れたシンボリックリンクの検出

リンク先が存在しないシンボリックリンク(dangling link)を検出する。

from pathlib import Path

def is_broken_symlink(path):
    p = Path(path)
    return p.is_symlink() and not p.exists()

# 使用例
if is_broken_symlink('link_to_target.txt'):
    print('壊れたシンボリックリンクです')

exists() はリンク先の存在を確認するが、is_symlink() はリンク自体の存在を確認する。両方を組み合わせることで壊れたリンクを検出できる。