すべてのレベルの深さにネストされたcwdに沿ったパスを参照する一般的な方法はありますか?これはほぼリバース相対パスルックアップと同じです。
たとえば、
$ pwd
/Users/somebody/foo/bar/baz
$ echo /[3] <-- 3rd directory from / in current path
/Users/somebody/foo
$ echo ~/[1] <-- 1 directory from ~ in current path
~/foo
ベストアンサー1
次の機能を次の項目に追加します.bashrc
。
parent() {
local count
local arg
count=$(($1+1))
if [ "$2" = "" ]
then
arg="$PWD"
else
arg="$2"
if [[ $arg != /* ]]
then
printf 'Warning: "%s" does not begin with "/".\n' "$arg"
fi
fi
cut -d/ -f1-"$count" <<< "$arg"
}
tparent() { # The ‘t’ stands for “tilde”.
local count
local arg
local home
count=$(($1+1))
if [ "$2" = "" ]
then
arg="$PWD"
else
arg="$2"
fi
if [ "$3" = "" ]
then
home="$HOME"
else
home="$3"
fi
if [[ $home != /* ]]
then
printf 'Warning: "%s" does not begin with "/".\n' "$home"
fi
if [[ $arg/ != $home/* ]]
then
printf 'Error: "%s" does not begin with "%s".\n' "$arg" "$home"
return 1
fi
printf '%s' "~${arg/$home}" | cut -d/ -f1-"$count"
}
最初の抽出に使用されます。cut -d/ -f1-number
N
パス名のコンポーネントです。
number
〜しなければならないN
最初のフィールドの前の空の文字列が最初のフィールド/
と見なされるため、+1 です。
使用法:
$ pwd
/home/gman/stack/JW
$ parent 3
/home/gman/stack
$ tparent 1
~/stack
これはスペースとタブのあるパスを処理できますが、改行文字は処理できません。