バッシュで、もしあるならVAR="/home/me/mydir/file.c"
、どうすれば入手でき"/home/me/mydir"
ますか?
バッシュで、もしあるならVAR="/home/me/mydir/file.c"
、どうすれば入手でき"/home/me/mydir"
ますか?
回答:
dirname
そしてbasename
あなたは、パス成分を抽出するために探しているツールです。
$ VAR=/home/me/mydir/file.c
$ DIR=$(dirname "${VAR}")
$ echo "${DIR}"
/home/me/mydir
$ basename "${VAR}"
file.c
これらは内部 Bashコマンドではありませんが、POSIX標準(、を参照)の一部であるためdirname
、basename
Bashを実行するシステムの大部分で使用できるはずです。
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir
$ echo "${VAR##*/}"
file.c
basename
との依存関係を回避するにはdirname
関連する注意点として、ファイル名または相対パスしか持っていない場合は、それだけではdirname
役に立ちません。私にとって、答えはになりましたreadlink
。
fname='txtfile'
echo $(dirname "$fname") # output: .
echo $(readlink -f "$fname") # output: /home/me/work/txtfile
次に、2つを組み合わせてディレクトリのみを取得できます。
echo $(dirname $(readlink -f "$fname")) # output: /home/me/work
readlink -m "$fname"
指定した名前を再帰的に正規化するために使用する必要があります
私はこれで遊んでいて、代替案を考え出しました。
$ VAR=/home/me/mydir/file.c
$ DIR=`echo $VAR |xargs dirname`
$ echo $DIR
/home/me/mydir
私が気に入った部分は、ツリーのバックアップを拡張するのが簡単だったことです。
$ DIR=`echo $VAR |xargs dirname |xargs dirname |xargs dirname`
$ echo $DIR
/home