答え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.tar
paulo
.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/\..*$//"