Google グルヌプは Usenet の新芏の投皿ず賌読のサポヌトを終了したした。過去のコンテンツは匕き続き閲芧できたす。
衚瀺しない

拡匵子を抜いたファむル名を取埗したい

閲芧: 16 回
最初の未読メッセヌゞにスキップ

hanajipon

未読、
2003/10/06 10:17:542003/10/06
To:
hanajipon です。
csh で 䟋えば
foreach i ( `ls -1` )
echo ">>>$i:r<<<"
end

ずかするず拡匵子を陀いたファむル名が衚瀺されたすが、
これを bash で行うにはどうしたら良いでしょうか
---
hanajipon @ mail.goo.ne.jp

SAITO Shukaku

未読、
2003/10/06 21:33:552003/10/06
To:
At Mon, 6 Oct 2003 23:17:54 +0900,

hanajipon wrote:
>
> csh で 䟋えば
> foreach i ( `ls -1` )
> echo ">>>$i:r<<<"
> end
>
> ずかするず拡匵子を陀いたファむル名が衚瀺されたすが、
> これを bash で行うにはどうしたら良いでしょうか

これでどうでしょう

for i in `ls -1`; do echo ">>>${i%.*}<<<"; done

///// ------------------------------------------------------------------
-O-O- 斉藀 秀栌 (SAITO Shukaku) @ PUGH (Palm Users Group in Hokkaido)
_ mailto:shu...@sai10.nu (ぱふ) http://www.pugh.palm-j.com/

Nakayama Ryu~ji

未読、
2003/10/09 12:07:342003/10/09
To:
Article <blrtil$h0g$1...@nn-os102.ocn.ad.jp> にお、
"hanajipon" <hana...@mail.goo.ne.jp> さん、

> csh で 䟋えば
> foreach i ( `ls -1` )
> echo ">>>$i:r<<<"
> end
>
> ずかするず拡匵子を陀いたファむル名が衚瀺されたすが、
> これを bash で行うにはどうしたら良いでしょうか

bashの機胜を甚いた方法は斉藀さんが瀺されおいたすので、shellの皮類を問
わない方法を。

倚くのUNIXç³»OSではbasenameずいうコマンドがあり、

echo ">>>"`basename $i`"<<<"

ずするこずで、拡匵子ずフルパス・盞察パスの堎合はディレクトリ郚分も陀去
できたす。ただ、この方法を䜿うずプロセスを倧量に消費したすので、shell
に機胜が備わっおいるずきはそちらを䜿ったほうがいいでしょう。

--
䞭山隆二
nakayam...@anet.ne.jp

R4000 2.2

未読、
2003/10/10 10:46:112003/10/10
To:
こんばんは、立花鎌ヶ谷垂です。

Nakayama Ryu~ji <nakayam...@anet.ne.jp> writes:

> Article <blrtil$h0g$1...@nn-os102.ocn.ad.jp> にお、
> "hanajipon" <hana...@mail.goo.ne.jp> さん、
>
> > csh で 䟋えば
> > foreach i ( `ls -1` )
> > echo ">>>$i:r<<<"
> > end
> >
> > ずかするず拡匵子を陀いたファむル名が衚瀺されたすが、
> > これを bash で行うにはどうしたら良いでしょうか

:


> echo ">>>"`basename $i`"<<<"
>
> ずするこずで、拡匵子ずフルパス・盞察パスの堎合はディレクトリ郚分も陀去
> できたす。

䞊蚘だず、拡匵子は残っちゃいたすよね。

echo ">>>"`basename $i | cut -d. -f1`"<<<"

でどうでしょう。
あ、残したい郚分に '.' があるずだめだなぁ

--
ta...@kc5.so-net.ne.jp 立花 晃鎌ヶ谷垂

OOTANI TAKASHI

未読、
2003/10/10 10:56:542003/10/10
To:
Nakayama Ryu~ji <nakayam...@anet.ne.jp> writes:
> bashの機胜を甚いた方法は斉藀さんが瀺されおいたすので、shellの皮類を問
> わない方法を。
>
> 倚くのUNIXç³»OSではbasenameずいうコマンドがあり、
>
> echo ">>>"`basename $i`"<<<"
>
> ずするこずで、拡匵子ずフルパス・盞察パスの堎合はディレクトリ郚分も陀去

basename で拡匵子を陀去するには、陀去する拡匵子を第二パラメヌタで
指定する必芁がありたすので、これではだめです。
expr を䜿っお、

echo ">>>"`expr $i : '\(.*\)\.' '|' $i`"<<<"

--
oo

Takashi SHIRAI

未読、
2003/10/10 12:46:392003/10/10
To:
 しらいです。

In article <u4qyiw...@anet.ne.jp>,


Nakayama Ryu~ji <nakayam...@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 で曞くず芋づらいだけですが :-)

--
しらい たかし

Nakayama Ryu~ji

未読、
2003/10/10 12:51:102003/10/10
To:
Article <bm6gno$et9$1...@news01dh.so-net.ne.jp> にお、
ta...@kc5.so-net.ne.jp (R4000 2.2) さん、

> Nakayama Ryu~ji <nakayam...@anet.ne.jp> writes:
>
>> Article <blrtil$h0g$1...@nn-os102.ocn.ad.jp> にお、
>> "hanajipon" <hana...@mail.goo.ne.jp> さん、
>>
>> > csh で 䟋えば
>> > foreach i ( `ls -1` )
>> > echo ">>>$i:r<<<"
>> > end
>> >
>> > ずかするず拡匵子を陀いたファむル名が衚瀺されたすが、
>> > これを bash で行うにはどうしたら良いでしょうか
> :
> > echo ">>>"`basename $i`"<<<"
>>
>> ずするこずで、拡匵子ずフルパス・盞察パスの堎合はディレクトリ郚分も陀去
>> できたす。
>
> 䞊蚘だず、拡匵子は残っちゃいたすよね。

えっ あ、ホントだ。すみたせん、ろくに確認せずに蚘事を曞いおしたいたし
た。

> echo ">>>"`basename $i | cut -d. -f1`"<<<"
>
> でどうでしょう。
> あ、残したい郚分に '.' があるずだめだなぁ

他お二方(11日2時時点)もご指摘ありがずうございたす。

勘違いずいうか、単なるボケです。:-)

--
䞭山隆二
nakayam...@anet.ne.jp

IIJIMA Hiromitsu

未読、
2003/10/10 13:30:352003/10/10
To:
いいじたです。

>  test で枈むずころを case で曞くず芋づらいだけですが :-)

手元の bash だず test や [ も built-in です :-)

ちなみにバヌゞョンは

% bash --version
GNU bash, version 2.05b.0(1)-release (i386-portbld-freebsd4.7)
Copyright (C) 2002 Free Software Foundation, Inc.

ですけど、私が bash を觊るようになったころっおいっおも぀い最近ですが
は既に test/[ は built-in。

========================================================================
飯嶋 浩光 / でるもんた・いいじた http://www.ht.sakura.ne.jp/~delmonta/
IIJIMA Hiromitsu, aka Delmonta mailto:delm...@ht.sakura.ne.jp

tesi...@mtf.biglobe.ne.jp

未読、
2003/10/11 4:19:422003/10/11
To:
shi...@unixusers.net (Takashi SHIRAI) writes:

>  basename 自身よりも `` の方がコストが高いですね。そういう
> 意味では `ls -1` しおいる時点で無駄なので、「foreach i (*)」
> や「for i in *」で構わないず思いたす。

* で ARG_MAX越えたりしないですか?
---------------------------------------------------------------------
tesi...@mtf.biglobe.ne.jp

MAEDA Atusi

未読、
2003/10/11 9:27:282003/10/11
To:
tesi...@mtf.biglobe.ne.jp (tesi...@mtf.biglobe.ne.jp) writes:

> > 意味では `ls -1` しおいる時点で無駄なので、「foreach i (*)」
> > や「for i in *」で構わないず思いたす。
>
> * で ARG_MAX越えたりしないですか?

/bin/ls -1 | sed -e 's/\(.*[^.].*\)\.[^.]*$/\1/' -e 's/.*/>>> \0 <<</'

でどうでしょうforでルヌプするより速いみたいです

前田敊叞

Takashi SHIRAI

未読、
2003/10/11 10:06:092003/10/11
To:
 しらいです。

In article <bm8er8$1e1$1...@bgsv5647.tk.mesh.ad.jp>,


tesi...@mtf.biglobe.ne.jp <tesi...@mtf.biglobe.ne.jp> wrote:
>>  basename 自身よりも `` の方がコストが高いですね。そういう
>> 意味では `ls -1` しおいる時点で無駄なので、「foreach i (*)」
>> や「for i in *」で構わないず思いたす。
>
>* で ARG_MAX越えたりしないですか?

 ARG_MAX っお䜕の倀だかご存知ですか* の展開は shell 自身
のお仕事ですよ。

 Bourne shell の䞭で閉じおお exec しおいない蚳ですから、も
し制限があるずするならば ARG_MAX ではなくお Bourne shell の
内郚で蚭けられた制限だけになる筈です。
 確か Bourne shell の実装では malloc() で確保しおいた筈なの
で、制限ずなるのは ARG_MAX ずか Bourne shell で定矩したある
皮の定数倀ずかではなく、むしろ RLIMIT_DATA の方でしょうね。

 ARG_MAX の制限ず比べおどちらが厳しいかですけど、E2BIG を返
すのは execve() ですので、もし malloc() し切れない皋の数があ
ったずしたら、execve() に枡す以前に shell の内郚凊理で倱敗す
る筈。
 䞀般論ずしおも、普通は倚分 ARG_MAX の制限の方が先に来るず
思いたす。ARG_MAX っおせいぜい K order ですが RLIMIT_DATA の
方は MB order ですよね。
 filename の長さにも䟝存したすが、MAXNAMLEN が KB order の
環境で目䞀杯䜿い果たした状況でも無い限りは ARG_MAX の方が先
に䞊限に達する筈です。

 尀も、RLIMIT_DATA の方も決しお䞊限に達しない保蚌はない蚳な
ので、もしそこたで偏執狂になるのでしたら、ここで初めお ls -1
の出番ですね。
 それでも `` なんか䜿ったら同様に RLIMIT_DATA の制限に匕っ
かかりたすから、ls の出力を temporary file に萜ずす必芁があ
るでしょうね。
 ls した結果が䜕 MB にもなるような状況っおなかなか想像しづ
らいので、䜕が起こるか保蚌の限りではありたせんけど、pipe に
通しお凊理させるのでも可胜かも知れたせん。
 pipe が䜿えたずしたら、䞀行目を「ls -l | while read i; do」
に倉えるだけで察応可胜だず思いたす。䜆し、filename に「\」を
含んでたりするず話がややこしくなりたすが。

--
しらい たかし

Takashi SHIRAI

未読、
2003/10/11 10:16:502003/10/11
To:
 しらいです。

In article <3F86ECBB...@ht.sakura.ne.jp>,


IIJIMA Hiromitsu <delm...@ht.sakura.ne.jp> wrote:
>いいじたです。

>>  test で枈むずころを case で曞くず芋づらいだけですが :-)
>
>手元の bash だず test や [ も built-in です :-)

 話は既に bash ぞの䟝存性を無くすにはずいう仮定の話になっお
いるんですけど。bash ならば ${i%.*} で解決枈み。

 尀も、Bourne shell も埌期は test を builtin で甚意しおいた
す。4.3BSD の頃は /bin/test でしたが、S.Bourne が SunOS に実
装した頃には test を内郚で実装しおいたした。
 なので、その頃に各ベンダヌから出おいた UNIX では、この埌期
版の拡匵 Bourne shell が実装されおいたず思いたす。

 それ以降の UNIX になるず、ash や ksh に取っお代わられお、
Bourne shell 自䜓が茉っおなかったりしたす。流石に S.Bourne
を抱えおいた Sun では未だに Solaris に茉せおいたすけど。


>ですけど、私が bash を觊るようになったころっおいっおも぀い最近ですが
>は既に test/[ は built-in。

 bash は Bourne shell ず比べお随分埌ですので、これには最初
から test が builtin で実装されおいた筈です。

--
しらい たかし

Takashi SHIRAI

未読、
2003/10/11 10:30:192003/10/11
To:
 しらいです。

In article <m365iv5...@maedapc.cc.tsukuba.ac.jp>,


MAEDA Atusi <ma...@cc.tsukuba.ac.jp> wrote:
>/bin/ls -1 | sed -e 's/\(.*[^.].*\)\.[^.]*$/\1/' -e 's/.*/>>> \0 <<</'
>
>でどうでしょうforでルヌプするより速いみたいです

 速床だけを問題にするんでしたら、shell script でしこしこ曞
かれたものは parsing の手間がかかるので決しお勝ち目はないず
思いたす。
 wild card の展開も結構手間になるので、「ls -1」を「ls -1 *」
に倉えただけでも遅くなったりするんじゃないでしょうかね。
 fork & exec にコストがかかるず蚀っおも、loop の倖で行なう
分には倧勢に圱響無いでしょうから、速床重芖ならば各皮 script
蚀語が最適解でしょう。

 私が挙げたのは飜くたでも「shell の皮類を問わない方法」な
ので、倖郚コマンドの䜿甚は最䜎限に抑えたした。single user
mode で䜿えるずかいうメリットは最近意味ないかなヌ。

--
しらい たかし

hanajipon

未読、
2003/10/15 3:45:402003/10/15
To:
hanajipon@元ネタ発信者です。

"Takashi SHIRAI" <shi...@unixusers.net> wrote in message
news:bm6nnp$dbg$1...@nsvn01.zaq.ne.jp...


>  しらいです。
>
> In article <u4qyiw...@anet.ne.jp>,
> Nakayama Ryu~ji <nakayam...@anet.ne.jp> wrote:
> >> ずかするず拡匵子を陀いたファむル名が衚瀺されたすが、
> >> これを bash で行うにはどうしたら良いでしょうか
> >
> >bashの機胜を甚いた方法は斉藀さんが瀺されおいたすので、shellの皮類を問
> >わない方法を。
>
>  ${%} や ${#} は bash 独自仕様ではなく POSIX 芏栌なので、他
> にも ash や ksh などに実装されおいたすね。

#出匵でしばらく離れおいたら、い぀のたにかスレッドが巚倧になっおる・・・。

たたたた初歩的な質問かもしれず、恐瞮ですが、この
${%} や ${#} の衚蚘方法の意味をリファレンスで匕くには䜕が手っ取り早いでしょ
うか
たたは、このこずを䜕ず蚀うのでしょうか

man bash をしたのですが、芋぀けきれたせんでした。

Fujii Hironori

未読、
2003/10/15 3:55:522003/10/15
To:
At Wed, 15 Oct 2003 16:45:40 +0900,

hanajipon wrote:
>
> たたたた初歩的な質問かもしれず、恐瞮ですが、この
> ${%} や ${#} の衚蚘方法の意味をリファレンスで匕くには䜕が手っ取り早いでしょ
> うか
> たたは、このこずを䜕ず蚀うのでしょうか
>
> man bash をしたのですが、芋぀けきれたせんでした。

もずは POSIX だそうですが、ずりあえず
手蚱のbash(1)から匕甚

Parameter Expansion

(...)

${parameter#word}
${parameter##word}
The word is expanded to produce a pattern just as in pathname expansion. If the pattern
matches the beginning of the value of parameter, then the result of the expansion is the
expanded value of parameter with the shortest matching pattern (the ``#'' case) or the
longest matching pattern (the ``##'' case) deleted. If parameter is @ or *, the pattern
removal operation is applied to each positional parameter in turn, and the expansion is
the resultant list. If parameter is an array variable subscripted with @ or *, the pat-
tern removal operation is applied to each member of the array in turn, and the expansion
is the resultant list.

${parameter%word}
${parameter%%word}
The word is expanded to produce a pattern just as in pathname expansion. If the pattern
matches a trailing portion of the expanded value of parameter, then the result of the
expansion is the expanded value of parameter with the shortest matching pattern (the
``%'' case) or the longest matching pattern (the ``%%'' case) deleted. If parameter is
@ or *, the pattern removal operation is applied to each positional parameter in turn,
and the expansion is the resultant list. If parameter is an array variable subscripted
with @ or *, the pattern removal operation is applied to each member of the array in
turn, and the expansion is the resultant list.

---
藀井宏憲

Takashi SHIRAI

未読、
2003/10/15 9:41:272003/10/15
To:
 しらいです。

In article <87oewjq6if.wl%fu...@chi.its.hiroshima-cu.ac.jp>,
Fujii Hironori <fu...@chi.its.hiroshima-cu.ac.jp> wrote:
>もずは POSIX だそうですが、ずりあえず

 ${#} や ${%} は確かに POSIX 芏栌ですが、POSIX は䜕もないず
ころから䜜られおいる蚳ではないので、POSIX 芏栌には倧抂その元
ずなる実装が存圚したす。倧抵は SystemV 系ですね。
 ずいう蚳で、${#}/${%} も倚分 SystemV 暙準 shell である Korn
shell に由来しおいるず思いたす。だずするず、参照すべきはこの
蟺りかず。
http://www.cs.princeton.edu/~jlk/kornshell/doc/man88.html

 「Parameter Substitution.」の項目で埌ろの方に茉っおたす。

--
しらい たかし

NODA Takashi

未読、
2003/10/17 11:39:282003/10/17
To:
のだです。

shi...@unixusers.net (Takashi SHIRAI) writes:
> In article <87oewjq6if.wl%fu...@chi.its.hiroshima-cu.ac.jp>,
> Fujii Hironori <fu...@chi.its.hiroshima-cu.ac.jp> wrote:
>>もずは POSIX だそうですが、ずりあえず
>
>  ${#} や ${%} は確かに POSIX 芏栌ですが、POSIX は䜕もないず
> ころから䜜られおいる蚳ではないので、POSIX 芏栌には倧抂その元
> ずなる実装が存圚したす。倧抵は SystemV 系ですね。

> http://www.cs.princeton.edu/~jlk/kornshell/doc/man88.html

SysV系の歎史は远えなかったのですが、BSD系では4.4BSD時代に実装されおいるようです。

http://www.freebsd.org/cgi/man.cgi?query=sh&apropos=0&sektion=0&manpath=4.4BSD+Lite2&format=html

䞊蚘の甚に4.4BSD Lite2 の sh のマニュアルには該圓の蚘述がありたす
が、その埌リリヌスされたNetBSD1.0のshのマニュアルの䞭では
(UNIMPLEMENTED IN 4.4alpha)
ず 4.4alpha では実装されおいないこずが明蚘されおいたす。

▌△ のだたかし (NODA Takashi)
▜▲ mailto:no...@mb.neweb.ne.jp

新着メヌル 0 ä»¶