トップページunix
1001コメント327KB

シェルスクリプト総合 その9

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2007/08/15(水) 07:25:02
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。


□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。

前スレ
シェルスクリプト総合 その8
http://pc11.2ch.net/test/read.cgi/unix/1171517324/
0313名無しさん@お腹いっぱい。2007/10/17(水) 09:05:20
その -print と -exec ls を同時にするという既知概じみた発想をなんとかしろ。
話はそれからだ。
0314名無しさん@お腹いっぱい。2007/10/17(水) 09:12:11
find `pwd` -type f -print | sed -e 's|/\([^/]*\)$| \1|g'
でどうかな。
0315名無しさん@お腹いっぱい。2007/10/17(水) 09:12:53
s/.../.../g は GNU 拡張で s|...|...|g にしたから、/ にする所は
適当に直してください。
0316名無しさん@お腹いっぱい。2007/10/17(水) 09:14:22
>>312
できたよ。

find `/bin/pwd` -type f -exec sh -c 'echo `dirname {}; basename {}`' \;
0317名無しさん@お腹いっぱい。2007/10/17(水) 13:53:01
>>315
> s/.../.../g は GNU 拡張で s|...|...|g にしたから、/ にする所は

それってGNU拡張?

雉も鳴かずば撃たれまいに……w
0318名無しさん@お腹いっぱい。2007/10/18(木) 01:54:00
>>317
うぉ、実はedからこういう挙動なのね:

 $ echo hogehoge > a
 $ ed a
 9
 ,s,hoge,fuga,g
 w
 9
 q
 $ cat a
 fugafuga

なんとなくPerlとかそういう無節操な時代になってからの事だとばかり・・・(恥
0319名無しさん@お腹いっぱい。2007/10/18(木) 19:51:23
んじゃ別解でも。
find "`/bin/pwd`" -type f -exec sh -c "echo \`dirname '{}';basename '{}'\`" \;

または312のようにそれぞれ一方だけを出力する方法はわかるのなら
それぞれ出力して後からくっつけるとかでもいいし
find 〜 -exec dirname '{}' \; > /tmp/dirname.txt
find 〜 -exec basename '{}' \; > /tmp/basename.txt
paste -d ' ' /tmp/dirname.txt /tmp/basename.txt

もしくはリストを出力させてwhileループで料理してもいい
find 〜 -print | while read f; do
echo "`dirname $f` `basename $f`"
done

他にはfindに-execを複数並べて、後から2行を1行にまとめるのでも。
find 〜 -exec dirname '{}' \; -exec basename '{}' \; | while read d; do read b; echo "$d $b"; done
■ このスレッドは過去ログ倉庫に格納されています