4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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
から相対パスで遡って操作できそうと考えています。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?