はじめに

こんにちは!今回はrealpathコマンドについて解説します。

realpathは、ファイルやディレクトリの絶対パスを取得するコマンドです。シンボリックリンクを解決したり、相対パスを絶対パスに変換したりできます。

パスの処理をする時には超便利ですよ。

realpathコマンドとは

realpathは、ファイルパスの絶対パス(フルパス)を返す外部コマンドです。

主な機能:

  1. シンボリックリンク解決 - シンボリックリンクの実体を追跡
  2. 相対パス変換 - 相対パスを絶対パスに変換
  3. パス正規化 - .././を解決
  4. 存在確認 - ファイルが存在するか確認
  5. 複数ファイル対応 - 複数ファイルのパスを一度に処理

スクリプトでパス処理する時にはほぼ必須です。

基本構文

1
realpath [オプション] ファイル...

ファイルの絶対パスを返します。

主なオプション

オプション 説明
-e, --canonicalize-existing ファイルが存在することを確認
-L, --logical シンボリックリンクを解決しない
-m, --canonicalize-missing ファイルが存在しなくても処理
-s, --strip 末尾のスラッシュを削除
-z, --zero NUL文字で区切る
--relative-to=BASE BASEからの相対パスで出力
-q, --quiet エラー出力を抑制

使用例

例1: 基本的なパス取得

1
realpath myfile.txt

実行結果:

1
/home/user/myfile.txt

相対パスを絶対パスに変換します。

例2: シンボリックリンクを解決

1
2
ln -s /usr/bin mylink
realpath mylink

実行結果:

1
/usr/bin

シンボリックリンクの実体のパスを返します。

例3: 相対パスを絶対パスに

1
2
cd /home/user
realpath ../config/app.conf

実行結果:

1
/home/config/app.conf

.././を解決して絶対パスに変換。

例4: 存在確認付き

1
2
realpath -e existing-file.txt
realpath -e nonexistent-file.txt

実行結果:

1
2
/home/user/existing-file.txt
realpath: nonexistent-file.txt: No such file or directory

-eオプションでファイル存在確認。

例5: 複数ファイルのパスを取得

1
realpath file1.txt file2.txt file3.txt

実行結果:

1
2
3
/home/user/file1.txt
/home/user/file2.txt
/home/user/file3.txt

複数ファイルのパスを一度に取得。

例6: シンボリックリンクを解決しない

1
2
ln -s /usr/bin mylink
realpath -L mylink

実行結果:

1
/home/user/mylink

-Lオプションでシンボリックリンクを解決しません。

例7: ファイルが存在しなくても処理

1
realpath -m /nonexistent/path/file.txt

実行結果:

1
/nonexistent/path/file.txt

-mオプションで、ファイルが存在しなくても処理。

例8: パスをシェル変数に保存

1
2
config_path=$(realpath ./config/app.conf)
echo "Config: $config_path"

実行結果:

1
Config: /home/user/config/app.conf

スクリプト内で絶対パスを変数に保存。

例9: ディレクトリパスを取得

1
realpath /etc/default/

実行結果:

1
/etc/default

ディレクトリのパスも取得可能。

例10: readlinkとの比較

1
2
3
4
5
# realpath(絶対パス)
realpath myfile.txt

# readlink(シンボリックリンク先)
readlink mylink

実行結果:

1
2
/home/user/myfile.txt
/usr/bin

realpathは絶対パス、readlinkはリンク先を返します。

Tips・注意点

scriptのディレクトリを取得

1
script_dir=$(realpath "$(dirname "$0")")

スクリプト自身のディレクトリを取得。

相対パスから絶対パスへ変換

1
2
# 相対パスを処理するなら realpath が便利
abs_path=$(realpath "./relative/path")

相対パス処理を簡潔に。

ファイル存在確認の活用

1
2
3
if realpath -e "$file" > /dev/null 2>&1; then
    echo "ファイルが存在します"
fi

ファイル存在確認に使える。

実践的な使い方

Backupスクリプト

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash
source_file="$1"
source_abs=$(realpath "$source_file")

if [ ! -e "$source_abs" ]; then
    echo "エラー: $source_abs が見つかりません"
    exit 1
fi

backup_dir="/backup"
backup_file="$backup_dir/$(basename "$source_abs").backup"
cp "$source_abs" "$backup_file"
echo "バックアップ: $backup_file"

相対パスで渡されたファイルを絶対パスに変換。

設定ファイル検索

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash
config_candidates=(
    "./app.conf"
    "/etc/app/app.conf"
    "$HOME/.app/config"
)

for config in "${config_candidates[@]}"; do
    if [ -e "$config" ]; then
        APP_CONFIG=$(realpath "$config")
        echo "設定ファイル: $APP_CONFIG"
        break
    fi
done

複数の候補から設定ファイルを検索。

ログ出力時のパス正規化

1
2
3
#!/bin/bash
logfile=$(realpath -m "$1")  # 存在しなくても処理
echo "$(date): ログ出力開始" >> "$logfile"

ログファイルパスを正規化。

シンボリックリンクの追跡

1
2
3
4
5
6
#!/bin/bash
target="$1"
while [ -L "$target" ]; do
    target=$(realpath "$target")
done
echo "最終的なファイル: $target"

シンボリックリンクをたどって実体を見つける。

まとめ

realpathコマンドのポイント:

  • ファイルの絶対パスを取得するコマンド
  • デフォルト: シンボリックリンクを解決して絶対パスを返す
  • -e: ファイル存在確認
  • -L: シンボリックリンクを解決しない
  • -m: ファイルが存在しなくても処理
  • -s: 末尾のスラッシュを削除
  • よく使う組み合わせ: realpath -e, $(realpath "$file")

スクリプトでパスを扱う時には超便利なコマンドですよ!