Help us understand the problem. What is going on with this article?

LinuxのBashでディレクトリにあるファイルのフルパス(絶対パス)を表示する

はじめに

初めての投稿なので至らぬことがあるかもしれませんが、どうかよろしくお願いいたします。おかしな点や改善点などがあれば遠慮なくコメントをください。

概要

この記事は一般的Linux環境(ここではdebian系を想定)のBashを使った、ディレクトリにあるファイルのフルパス(絶対パス)を表示するコマンド(スクリプト)を紹介します。

動機

Google Compute Engine(GCE)のコンソールでファイルをダウンロードする際にファイルのフルパスが必要になったために作りました。

仕様

コマンド名

lfでは、"ls"で表示されるファイルと同じファイルを同じ順でフルパスで表示します。
lfaでは、"ls -a"で表示されるファイルと同じファイルを同じ順でフルパスで表示します。つまり、ドットファイルも表示されます。
lftでは、"ls -t"で表示されるファイルと同じファイルを同じ順でフルパスで表示します。つまり、更新時刻が新しい順に表示されます。

入力仕様

入力としてコマンド引数に、ファイル名(ファイルパス)やディレクトリ名(ディレクトリパス)を複数指定できるようにします。相対パス、絶対パスどちらでも構いません。ディレクトリが含まれていない場合はカレントディレクトリにあると想定します。PATH変数等から検索はしません。
グロブ (glob) はコマンド側では制御しません。

出力仕様

入力されたファイル名やディレクトリ名の順に処理を行い、ディレクトリならばそのディレクトリにあるすべてのファイルのフルパスを標準出力に出力します。ディレクトリではない場合はファイルのフルパスを標準出力に出力します。

エラー処理

引数に指定されたパスが存在しない場合はエラーを出力します。

実装

実装は ~/.bashrc の最後に記述しました。
readlinkが使えない場合はコメントにされている次の行を使用してください。
"--color=auto"は不要だと思いますので消しても良いです。

~/.bashrc
function _lsfp () 
{ 
    local dir file;
    if [[ -d $1 ]]; then
        dir=$(cd "$1";pwd);
        ls --color=auto -1 $2 "$1" | while read file; do
            echo "$dir/$file";
        done;
    elif [[ -e $1 ]]; then
         readlink -f "$1"
#         echo "$(cd $(dirname "$1");pwd)/${1##*/}";
    else
        echo "'$1' is not found." >&2;
    fi
}

function lsfp () 
{ 
    local arg;
    [[ $# -eq 0 ]] && _lsfp "$(pwd)" || for arg in "$@";
    do
        _lsfp "$arg";
    done
}

function lsfpa () 
{ 
    local arg;
    [[ $# -eq 0 ]] && _lsfp "$(pwd)" -a || for arg in "$@";
    do
        _lsfp "$arg" -a;
    done
}

function lsfpt () 
{ 
    local arg;
    [[ $# -eq 0 ]] && _lsfp "$(pwd)" -t || for arg in "$@";
    do
        _lsfp "$arg" -t;
    done
}

alias lf='lsfp'
alias lfa='lsfpa'
alias lft='lsfpt'

試験

$ cd ~/
$ source ./.bashrc
$ lf
$ lfa
$ lft
$ lf ~/

あとがき

Bashはとても便利ですね。これから色々使っていこうと思います。最後まで読んでくれてありがとうございます。

追記

短くしてサイズ順(大きい順)で表示するlfsも追加してみました。関数名等が変わっています。

~/.bashrc
function __lsfp () 
{
    local dir file;
    if [[ -d $1 ]]; then
        [[ $rl ]] && dir=$(readlink -f "$1") || dir=$(cd "$1";pwd);
        ls --color=auto -1 $2 "$1" | while read ent; do
            echo "$dir/$ent";
        done;
    elif [[ -e $1 ]]; then
         [[ $rl ]] && readlink -f "$1" || echo "$(cd $(dirname "$1");pwd)/${1##*/}";
    else
        echo "'$1' is not found." >&2;
    fi
}

function _lsfp () 
{
    local opt arg rl;
    which readlink >/dev/null 2>&1 && rl=1
    [[ $1 =~ ^-[A-Za-z\-]$ ]] && { opt=$1; shift; }
    [[ $# -eq 0 ]] && __lsfp "$(pwd)" $opt || for arg in "$@";
    do
        __lsfp "$arg" $opt;
    done
}

alias lf='_lsfp --'
alias lfa='_lsfp -a'
alias lft='_lsfp -t'
alias lfs='_lsfp -S' # サイズ順
aachyee
Hi, I'm a programmer. I use Javascript and Ruby, Bash, Java, C/C++.
http://aachyee.blogspot.com/
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした