(不明)拡張子を除くパス名のファイル名

(不明)拡張子を除くパス名のファイル名

一つあるパス名抽出できるファイル名、除外先験的に既知の拡張子基本名:

$ pathname="/home/paulo/paulo.pdf"
$ printf "%s\n" "$(basename $pathname .pdf)"
paulo

しかし、拡張子がわからない場合はどうすればよいですか?

答え1

zshシェルから:

$ pathname=/home/paulo/paulo.pdf
$ printf '%s\n' $pathname:t:r
paulo
  • 修飾子:t( "tail")は最後のパス名コンポーネントを抽出します$pathname(同様に機能しますbasename)。
  • 修飾子:r(私の推測では「ルート」)は、ファイル名のビットを拡張子(存在する場合)まで抽出します。拡張子はファイル名の最後のドットの後の部分です。これは、次のことが得られることを意味します.zshrc

その他の関連修飾子は次のとおりです。

  • :h(「head」)はdirname
  • :e(「拡張子」)、拡張子のみを抽出します。

答え2

あなたはそれを使用することができますシェルパラメータ拡張修飾子:

$ pathname="/home/paulo/paulo.pdf"
$ filename=${pathname##*/}
$ printf "%s\n" "$filename"
paulo.pdf
$ basename=${filename%.*}
$ printf "%s\n" "$basename"
paulo

${pathname##*/}pathname最も長い一致プレフィックスを引いたものに展開されます*/つまりフルパス(利用可能な場合)最短のサフィックス一致を引いたもの${filename%.*}に展開されます。filename.*つまりファイル拡張子(存在する場合)。

これは、ドットでマークされたファイル名の最後の部分だけを削除するため、nopaulo.tar.gzになります。厳密に言えば、拡張子は次のようになります(Tarballの圧縮ファイルです。拡張子はファイルを抽出した後にのみ意味があります)。paulo.tarpaulo.gz.tar

拡張子のないドットファイルの場合でも正しく機能しません。例えば .bashrcまたは.zshrc;basenameが空になります。これはデフォルト値を使用して処理できます。

$ pathname="/home/paulo/.zshrc"
$ filename=${pathname##*/}
$ printf "%s\n" "$filename"
.zshrc
$ basename=${filename%.*}
$ printf "%s\n" "$basename"

$ printf "%s\n" "${basename:-$filename}"
.zshrc

答え3

これにより、目的のタスクが実行されます。

pathname="/home/paulo/paulo.pdf"
printf "%s\n" "$(basename $pathname)" | sed "s/\..*$//"

関連情報