/home/test/domain/example.txt
長さとファイル拡張子が完全に異なる可能性があるファイルパスがあります。たとえば、
/reallylongpath/example/longername.vb
拡張子「.」を削除したら、ファイル名を除くすべてを削除する必要があります。上記の2つの例が必要example
ですlongername
。
私は「/」の最後の項目に行きたいと思いますが、わかりません。
私はbashを使ってこれを行うことを願っています。
答え1
固定拡張の場合は、basename
このユーティリティを使用して以下を実行できます。
$ f=/home/test/domain/example.txt
$ basename -- "$f" .txt
example
ただし、任意の拡張子があるため、に渡す最後の拡張子を明示的に選択する必要がありますbasename
。ここでは、シェルのパラメータ拡張を使用できます。
$ basename -- "$f" ".${f##*.}"
example
または、その場合は、パラメータ拡張を使用して両方の削除を実行します。
$ x="${f##*/}"; x="${x%.*}"; echo "$x"
example
${var##pattern}
var
最も長いプレフィックス一致を削除しますpattern
。代わりに%%
サフィックスを使用し、1 つ#
または%
最短のプレフィックスまたはサフィックスを使用します。
.txt.gz
単一の拡張などのものを削除したい場合は、代わりにx="${x%%.*}"
(with double %%
)を使用できます。
与えられたパスが末尾のスラッシュ/
で終わる場合、最後の解決策は空の文字列を出力として提供しますbasename
。注目すべきもう1つの状況は、ディレクトリ名にドットが含まれている可能性があり、ファイル名にドットが/home/test/domain.orig/example.txt.gz
まったく含まれない可能性があることです。 (これはすべての状況を再確認したわけではありません。)
関連する問題の議論については、以下を参照してください。
答え2
basename /reallylongpath/example/longername.vb |cut -d"." -f1
編集:ファイル名に「.」が含まれると失敗します。しかし、
basename /reallylongpath/example/lo.ngername.vb |rev| cut -d"." -f2- |rev
あなたに正しい情報を提供します
lo.ngername