Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

ShellScriptでファイルの絶対パスを得るならreadlink

More than 1 year has passed since last update.

readlinkがある前提であり、正確には「ShellScriptなら」とは言えないか。

bash で ファイルの絶対パスを得る - Qiita コメント:#comment-10d1b710bcf7df114cb7

昔に自分でリンク張っておきながら忘れるんですよね。

readlink コマンド | コマンドの使い方(Linux) | hydroculのメモ
(なので正確には readlink -f)

そして忘れたまま手動で判定しようと書きかけると、こう詰まる。

fish function
function test
    # 引数は処理対象ファイルひとつのみ(好きなだけ渡せたほうがいいけど)
    if test (count $argv) -ne 1
        echo "引数を一つ設定してください" $argv >&2
        return 1
    end

    set file $argv[1]

    # 引数で渡したファイルがなければエラー
    if test ! -f $file
        echo "ファイルを指定してください" $file >&2
        return 1
    end

    # 最初の一文字を見て、ファイル指定を絶対パスか相対(ホームからの)パスかを判定する    
    set first_str (string sub -l 1 $file)
    if      test "." = $first_str
        echo "相対パス"
        # pwdくっつける
    else if test "~" = $first_str
        echo "ホームからの相対パス"
    else if test "/" = $first_str
        echo "絶対パス"
    else
        echo "カレントのファイル"
        # pwdくっつける
    end
end

やりたかったことは、引数で渡されたファイルの親族?ディレクトリ。
兄弟や親のディレクトリへの操作をしたいと考えた。
mvcpのように移動先を指定せず、一定のルールで処理先を決定させるようなもの。

例えば
/tmp/original/hoge

/tmp/original_moved/hoge
に移動させるような。

でも先頭一文字だけでは
.configなどのドットファイルに対応できない。
~hogeなどのファイルも作れるので、

二文字・三文字見て区切り文字まで見なければならないなと考えた。
./, ../, ~/なら相対・ホームパス。
どうにも筋が悪そう。
振り返れば最初に手動で判定しようとしたところから筋が悪いので、絶対パスの取得ぐらいはコマンドで取ろうという考えをすぐに持ちたいところ。
という失敗例でした。

絶対パスがとれたら

dirname
から相対パスで遡って操作できそうと考えています。

khsk
週一ぐらいでなにか書いていました。 いろいろお休み中。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away