私はファイルを持っていると仮定/from/here/to/there.txtし、そのdirnameのの最後の部分だけを取得したいtoの代わりに/from/here/to、私は何をすべきでしょうか?
私はファイルを持っていると仮定/from/here/to/there.txtし、そのdirnameのの最後の部分だけを取得したいtoの代わりに/from/here/to、私は何をすべきでしょうか?
回答:
basenameファイルでなくても使えます。を使用してファイル名を削除しdirname、を使用basenameして文字列の最後の要素を取得します。
dir="/from/here/to/there.txt"
dir="$(dirname $dir)" # Returns "/from/here/to"
dir="$(basename $dir)" # Returns just "to"
dirそれを設定しているとき、私は前にドルを持っているべきではありませんでした。
Bashパラメーター展開を使用すると、次のことができます。
path="/from/here/to/there.txt"
dir="${path%/*}" # sets dir to '/from/here/to' (equivalent of dirname)
last_dir="${dir##*/}" # sets last_dir to 'to' (equivalent of basename)
外部コマンドが使用されないため、これはより効率的です。
純粋なBASHの方法:
s="/from/here/to/there.txt"
[[ "$s" =~ ([^/]+)/[^/]+$ ]] && echo "${BASH_REMATCH[1]}"
to
.。ディレクトリにドットがある場合は機能しません.。シンプルに保ち/、区切り文字としてスラッシュを使用します。
もう1つの方法
IFS=/ read -ra x <<<"/from/here/to/there.txt" && printf "%s\n" "${x[-2]}"
printf "%s\n" "${x[-2]}"。
この質問はのようなものですTHIS。
あなたができることを解決するために:
DirPath="/from/here/to/there.txt"
DirPath="$(dirname $DirPath)"
DirPath="$(basename $DirPath)"
echo "$DirPath"
私の友人が言ったように、これも可能です:
basename `dirname "/from/here/to/there.txt"`
パスの一部を取得するには、次のようにします。
echo "/from/here/to/there.txt" | awk -F/ '{ print $2 }'
OR
echo "/from/here/to/there.txt" | awk -F/ '{ print $3 }'
OR
etc
一番上の答えは、尋ねられた質問に対して絶対的に正しいです。長いパスの途中に必要なディレクトリがある、より一般的なケースでは、このアプローチはコードを読みにくくします。例えば :
dir="/very/long/path/where/THIS/needs/to/be/extracted/text.txt"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(basename $dir)"
この場合、次のものを使用できます。
IFS=/; set -- "/very/long/path/where/THIS/needs/to/be/extracted/text.txt"; set $1; echo $6
THIS