はじめに
初めての投稿なので至らぬことがあるかもしれませんが、どうかよろしくお願いいたします。おかしな点や改善点などがあれば遠慮なくコメントをください。
概要
この記事は一般的Linux環境(ここではdebian系を想定)のBashを使った、ディレクトリにあるファイルのフルパス(絶対パス)を表示するコマンド(スクリプト)を紹介します。
動機
Google Compute Engine(GCE)のコンソールでファイルをダウンロードする際にファイルのフルパスが必要になったために作りました。
仕様
コマンド名
lfでは、"ls"で表示されるファイルと同じファイルを同じ順でフルパスで表示します。
lfaでは、"ls -a"で表示されるファイルと同じファイルを同じ順でフルパスで表示します。つまり、ドットファイルも表示されます。
lftでは、"ls -t"で表示されるファイルと同じファイルを同じ順でフルパスで表示します。つまり、更新時刻が新しい順に表示されます。
入力仕様
入力としてコマンド引数に、ファイル名(ファイルパス)やディレクトリ名(ディレクトリパス)を複数指定できるようにします。相対パス、絶対パスどちらでも構いません。ディレクトリが含まれていない場合はカレントディレクトリにあると想定します。PATH変数等から検索はしません。
グロブ (glob) はコマンド側では制御しません。
出力仕様
入力されたファイル名やディレクトリ名の順に処理を行い、ディレクトリならばそのディレクトリにあるすべてのファイルのフルパスを標準出力に出力します。ディレクトリではない場合はファイルのフルパスを標準出力に出力します。
エラー処理
引数に指定されたパスが存在しない場合はエラーを出力します。
実装
実装は ~/.bashrc の最後に記述しました。
readlinkが使えない場合はコメントにされている次の行を使用してください。
"--color=auto"は不要だと思いますので消しても良いです。
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も追加してみました。関数名等が変わっています。
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' # サイズ順