Re: 拡張子を抜いたファイル名を取得したい
しらいです。
In article <u4qyiwg1l.fsf@anet.ne.jp>,
Nakayama Ryu~ji <nakayama.ryuji@anet.ne.jp> wrote:
>> とかすると拡張子を除いたファイル名が表示されますが、
>> これを bash で行うにはどうしたら良いでしょうか?
>
>bashの機能を用いた方法は斉藤さんが示されていますので、shellの種類を問
>わない方法を。
${%} や ${#} は bash 独自仕様ではなく POSIX 規格なので、他
にも ash や ksh などに実装されていますね。
>多くのUNIX系OSではbasenameというコマンドがあり、
>
>echo ">>>"`basename $i`"<<<"
find ならともかく、ls -1 の出力に対して basename が有効と
なるような局面は想像だに出来ないんですけど、一体何と勘違いさ
れたんでしょうか?
今回のような用途だと普通は expr でしょうかね。sed とか awk
とか perl とかの方が手っ取り早いかも。
>とすることで、拡張子とフルパス・相対パスの場合はディレクトリ部分も除去
>できます。ただ、この方法を使うとプロセスを大量に消費しますので、shell
>に機能が備わっているときはそちらを使ったほうがいいでしょう。
basename 自身よりも `` の方がコストが高いですね。そういう
意味では `ls -1` している時点で無駄なので、「foreach i (*)」
や「for i in *」で構わないと思います。`ls -1a` なら wildcard
での置換えはちょっと tricky になりますけど。
コストを極力抑え、Bourne shell 標準の機能だけで実現させる
ならばこんな感じでしょうかね。
---- Cut Here ----
#!/bin/sh
for i in *; do
case "${i}" in
'*')
break
;;
esac
OIFS=${IFS}
IFS=.
set -- ${i}
IFS=${OIFS}
i=$1
while :; do
shift
case "$#" in
0|1)
break
;;
*)
i=${i}.$1
;;
esac
done
echo ">>>"${i}"<<<"
done
---- Cut Here ----
最後の echo(1) 以外 fork も exec もしない筈。最近の実装で
は echo すら builtin だったりするので、それだと全部 shell の
中だけで閉じるかな。
# test で済むところを case で書くと見づらいだけですが :-)
--
しらい たかし
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735