シェルスクリプト総合@LINUX Part3at LINUX
シェルスクリプト総合@LINUX Part3 - 暇つぶし2ch331:320
07/11/17 10:54:12 oelt9+66
>>327
レスありがとうございます。

そうなんですよ、そんな風に展開されてしまうんですよ。
${DIR} だけを出力しても
./AVG Anti-Virus Free Edition 7.3
となるのに
"${DIR}" とダブルクォートで囲っても
./AVG Anti-Virus Free Edition 7.3
と全く同じ出力になってしまう。つまりダブルクォートが利いてない・・。
だからそれをどうすれば1つの文字列として扱えるのですか?空白を区切りとしないようにする為には・・・。

332:login:Penguin
07/11/17 12:01:58 dajSe2oX
>331
basename の結果が正しいんだからダブルクォートは効いてるだろ?
その後、`` で置き換えた時には既に "${DIR}" とは無関係の文字列なんだから
直書きされてるのと同様に空白で分割されてるだけ。

あえて書くなら

for DIR in ./*/
do
    BASE=`basename "${DIR}"`
    for TARG in "${BASE}"
    do
        echo ${DIR}
        echo ${TARG}
    done
done

っていうか、なんで 2 段で for を回す必要があるのか。

333:login:Penguin
07/11/17 12:23:43 dh2GLbwy
>>331
バッククォート内はコマンドの出力に置き換えされるんだから、その出力を
クォートすればいい。
for TARG in "`basename "${DIR}"`"

っていうか、なんで 2 段で…


334:320
07/11/17 22:43:03 oelt9+66
>>332-333
な、なるほど・・・・
お二人の解説文を10回ほど読み直しながらじっくり考えてみた所、ようやく理解できました。
特に "`basename "${DIR}"`" はややこしくて 最初は何をかいているのだろうかと思いましたが
`basename "{DIR}"` の出力結果そのものを " " で囲っているわけですね。なるほどなるほど。
う~ん、これは思いつかない・・・。発想力ですか・・・。

で、2段でfor回していますが、確かに冷静に考えると2段で回す必要はありませんね・・・。
むしろ2段で回す処理にしている事で複雑化してしまった感があります。
1段forでいけそうです。

335:login:Penguin
07/11/23 15:28:58 P7OyMgNI
>326です。
拡張が必要になり、問題が増えました。

#!/bin/sh
echo $LIST; # "aaa aaa" "bbb" "ccc ccc ccc" "ddd"

func(){
~処理~
}

func "eee eee" "fff fff" "$LIST" "ggg ggg";

以下のようにfuncにスペースを含んだ形で
${LIST}とその他の値を同列に引数として渡したいのです。

↓funcに渡したい引数
"eee eee" "fff fff" "aaa aaa" "bbb" "ccc ccc ccc" "ddd" "ggg ggg"

>>328 >>330にあったように eval func で展開すると
LIST以外の引数がスペースで展開されてしまいます。

LIST以外の引数を "eee\ eee" とか"\"eee eee\""とする手で回避も可能ですが、
修正箇所が増えるので、極力この形は取りたくありません。
なにか方法はありませんか?

336:login:Penguin
07/11/23 22:55:10 rrMjYG9S
Σ^)/アホーアホー☆ミ-

337:login:Penguin
07/11/23 23:18:09 OSmgQwJo
uniqはsortしておかないとだめですが、
sortしなくても2回目意向の重複を削除するコマンド内ですか?

338:login:Penguin
07/11/23 23:25:42 KoVu18yL
some | command | perl -ne 'print unless $seen{$_}++'


339:login:Penguin
07/11/24 02:54:03 Qc2k01yB
>>335
func をスペースを分割しないで処理するようにして、
func に渡す前に "$LIST" だけ分割しちゃえば良いんじゃないの?


340:login:Penguin
07/11/24 13:44:38 3ItHeK84
>>338
おおおお、できました。ありがとうございました。

341:login:Penguin
07/11/24 15:57:48 uBYpiRKV
From - Fri Nov 20 14:53:45 2007
From: "Jfda dsadsada" <fdsfdsa@thdsadaer.de>
From - Fri Nov 21 14:53:45 2007
From: "rwerw dfsa" <sfdaf@fdfds.com>
From - Fri Nov 23 14:53:45 2007
From: "a bcd" <d@dfds.com>
From - Fri Nov 23 14:53:46 2007
From: "abc" <abc@abc.net>

このようなテキストの中から、日付に対応したアドレスだけをテキストに出力するにはどうしたらいいのでしょうか?
11月20日が指定されたらfdsfdsa@thdsadaer.deを出力
11月23日が指定されたらd@dfds.comとabc@abc.netを出力といった具合です

342:login:Penguin
07/11/24 16:23:59 bvlPAES0
grep -A1 "Nov 20" | grep -o "<.*@.*>"

343:login:Penguin
07/11/24 17:59:39 z00X8bIQ
>>339それが出来れば良いんですが、
できないのです。方法ありますか?

func内で echo $3; した場合。

func "eee eee" "fff fff" "$LIST" "ggg ggg";
echo $3 → "aaa aaa" "bbb" "ccc ccc ccc" "ddd"
当然のように、LIST全体が一つの引数に、、、

以下のようにクォートをなくすと
func "eee eee" "fff fff" $LIST "ggg ggg";
echo $3 → "aaa
LIST内のスペースで、分解されてしまいます。

$3 に "aaa aaa" を渡したいのに、、、

344:login:Penguin
07/11/24 22:04:52 DnopHw8N
無理にシェルで書くより
perl かなんか使った方がいいんじゃね。
適材適所。

345:login:Penguin
07/11/24 22:28:40 bmHXinLt
eval set $LIST
func "eee eee" "fff fff" "$@" "ggg ggg"


346:login:Penguin
07/11/25 17:46:10 ex492j4k
>>345
これだ!
こんなトリッキーな手法もあるんですね。
奥が深い。ありがとうございました。

347:login:Penguin
07/11/25 22:12:54 nNUo7Vyu
>>342
ありがとうございました

348:login:Penguin
07/11/28 16:44:21 lxwXbk7L
特定のディレクトリ以下にあるディレクトリ名を検索し
そのディレクトリの中にファイルがあった場合のみ変数にディレクトリ名を追加する。
という処理をしたいと考えています。

LIST=`find 特定のディレクトリ -maxdepth 1 -mindepth 1 -type d`
上記のコマンドでディレクトリ一覧は取得できたのですが
取得したディレクトリ一覧の中にファイルがあるかどうかの条件設定方法がわかりません
ご教授ください

349:login:Penguin
07/11/28 16:51:01 hjQ8uHjr
>>348
GNU の find なら ! -empty で。

350:348
07/11/28 17:14:26 lxwXbk7L
>>349
レスありがとうございます。
LIST=`find 特定のディレクトリ -maxdepth 1 -mindepth 1 -type d ! -empty`
上記のコマンドで無事に条件を満たすことが出来ました。

感謝です><

351:login:Penguin
07/11/30 01:52:45 vbHro4B7
1 A
1 B
1 C
2 P
2 Q
3 X
3 Y
3 Z
...
のような入力を
1 A B C
2 P Q
3 X Y Z
...
のように整形する簡単な方法はありますか?

352:login:Penguin
07/11/30 02:21:47 8mp/o88K
awk '{h[$1] = h[$1] " " $2} END { for (key in h) print key h[key] }' < input | sort




353:login:Penguin
07/11/30 13:45:29 zEAz9Kgp
>>352
惚れた

354:login:Penguin
07/12/01 01:13:52 285rAG3t
inputをリダイレクトしているのがイヤ。

355:login:Penguin
07/12/01 01:27:18 aR34EpD+
awkはファイル名を引数に取れるんだな。
パイプでしか使った記憶がなく、素で知らなかった。




356:login:Penguin
07/12/01 11:59:35 lphCOL1Q
むしろパイプでしか使えないコマンドの名前を
パッと挙げろという方がむつかしいだろ

357:login:Penguin
07/12/01 12:16:31 z08ppphA
オプションの引数という形もない、というものはだいぶ少ないね

358:login:Penguin
07/12/01 19:59:33 aR34EpD+
とっさに出てきたのは tr


359:login:Penguin
07/12/01 21:03:16 z08ppphA
MS-DOS 標準添付の SORT (.EXE か .COM か自身がない)

360:login:Penguin
07/12/01 23:25:16 +jVAJI5Z
MS-DOS 標準添付の MORE

361:login:Penguin
07/12/03 14:25:58 pB5IpK3Q
複数のコマンドを実行してログを残したいのですが

( { command1 && command2 } > normal.log ) >& error.log

で、標準出力と標準エラーをファイルにリダイレクトまではうまくいきました。
このエラー出力を、画面にも出すにはどんなふうに書くのでしょう?

URLリンク(x68000.q-e-d.net)
ちなみに、ここまではこの辺を参考にさせていただきました。

お願いいたします。

362:login:Penguin
07/12/03 14:26:53 pnpsuBAG
>>361
tee

363:login:Penguin
07/12/03 15:02:26 pB5IpK3Q
>>362
ありがとうございます
できました。

最初に言ってたのとちょっと違うのですが、ようは、すべてログに保存して
なおかつERRORの文字が入ってる行だけを画面に出力したかったので

2>&1 | tee file.log | grep ERROR

でやりたいことができました。
いろいろ勉強になりました。サンクス。

364:login:Penguin
07/12/03 16:10:39 +7LXyEUm
コマンドラインとGUIを融合するHotwire
URLリンク(opentechpress.jp)

365:login:Penguin
07/12/03 16:33:46 CJjSSdo9
>>364
面白そうだけど、記事の中に具体的な画像が欲しいね・・・・

366:login:Penguin
07/12/03 16:43:39 pm3xTTNy
>>365
URLリンク(code.google.com)

367:login:Penguin
07/12/03 17:31:20 BNt6sl0D
>>366
画像が表示されないのは、送ってくるContent-Typeがおかしいのか。
なんでapplication/octet-streamやねん。

368:login:Penguin
07/12/04 22:59:48 Bpu7L1AF
ややスレ違いだが、くだ質よりこっちかなと

シェルスクリプトの本を買う際に、Linuxユーザーでbashメインで使ってるなら
主旨がbash向けのものを買うべきですか?
それともB shell全般向けやsh向けでbashは補完程度の本でも質の高いものを買うべきでしょうか
両シェルの間にそれほど機能、性格の差はなさそうだし

369:login:Penguin
07/12/04 23:06:21 0gQg9Z1k
bashismって言葉があるくらいで、ついついbashの機能を使ってしまうことは多い。
素のBourne Shellの機能がどこまでなのか書いてある本がいいと思う。


370:login:Penguin
07/12/04 23:28:47 Bpu7L1AF
>>369
サンクス
sh向けでも最近の多くの書籍はbashもカバーしているようですので、その辺りを探してみます

371:login:Penguin
07/12/05 11:12:29 tDVDuECI
URLリンク(www.amazon.co.jp)
そのへん意識するならこれいいかも。
SunOS の bsh と FreeBSD の bsh ( ash ) で違いがある場合についてまで
明記されてる。

372:login:Penguin
07/12/05 21:59:53 KlliiKVC
>>371
その本と、「UNIXシェルスクリプトコマンドブック 山下 哲典」を最後に候補にしてましたが、後者を買いました。
sh、bash共用でサンプルが多いので。

373:login:Penguin
07/12/06 18:06:51 ltYfbiEn
いつも複合条件式でまるんですけど
#!/bin/bash
WAITSEC=""
if [ -z "$WAITSEC" -o $WAITSEC -lt 60 ]; then
    WAITSEC=10
fi
を実行すると
./hoge.sh: line 3: [: too many arguments
というエラーになります。-oとか-aで記述するifは今まで何回かやったのに
一度もできた記憶が無い!!。結局ifを分けたりして対処してきた負け人生です。

いったい何が悪いというのでしょうか??
教えていただけますか?

374:login:Penguin
07/12/06 18:31:24 bgO18Eza
確かにbashだとなるねぇ。zshだとならんから気づかなかったw

#!/bin/bash
WAITSEC=$1
if [ -z "$WAITSEC" ] || [ $WAITSEC -lt 60 ]; then
WAITSEC=10
fi

echo $WAITSEC

とりあえずこれで。

375:login:Penguin
07/12/06 18:35:40 bgO18Eza
と、思ったら出来たw
if [ -z "$WAITSEC" -o \( $WAITSEC -lt 60 \) ]; then

こういうことだな。
優先順位がおかしいんだ。

376:login:Penguin
07/12/07 00:20:04 2WlU8Mqa
>>373
-z "$WAITSEC" の成否にかかわらず $WAITSEC -lt 60が実行されちゃってるから問題なんじゃないか?
おそらく -z "$WAITSEC"のときは 後ろの条件は 「-lt 60」になるだろうから、>>374のようにするか${WAITSEC:-0}とかやったらいいんじゃね?

377:login:Penguin
07/12/07 10:01:03 uKkYmJTB
>WAITSEC=""
なので、
>if [ -z "$WAITSEC" -o $WAITSEC -lt 60 ]; then

if [ -z "" -o -lt 60 ]; then
と解釈されてエラー。
zsh は sh と違って $WAITSEC は "$WAITSEC" と同じ意味なのでエラーにならない。

"$WAITSEC" -lt 60 と書き換えた場合は、

>-z "$WAITSEC" の成否にかかわらず $WAITSEC -lt 60が実行されちゃってるから問題なんじゃないか?

この理由で正しい。


378:login:Penguin
07/12/11 22:53:04 8t30b6aC
シェルスクリプトにコメントを書くには
# comment

っていう感じに # を行頭につけてコメントにしますが、自作のシェルスクリプト等に
日本語でコメントを埋め込むのは良くない事なのでしょうか?
英語でコメントを埋め込むべきなのでしょうか?

理由>環境によっては文字化けするかもしれないから

その場合、英語では上手くコメントがかけないのですが、、、皆さんはこの辺どうしていますか?

379:login:Penguin
07/12/11 23:22:06 8VUAk6YG
>>378
英語では上手くコメントがかけない、って、自分が書いた自分用のスクリプトだったら、
べつに、自分にさえ分かればいいんじゃないの?極端な話、ローマ字で書いた日本語でもいいんじゃないかと。

380:login:Penguin
07/12/11 23:27:45 LcSZkVoI
Shift_JISで書いて2バイト目に ¥ が含まれるとコメントが継続しちまうかな、
と思ったんだが、そうでもないみたいだな。


381:login:Penguin
07/12/12 08:33:10 itajSrlG
>>379
いやー、他の人にもスクリプトの内容が分かるようにコメント書かないといけない場合はどうすれば?
今はローマ字で書いたりしていますが、さすがに見にくいというか・・・ かといって英語では上手くかけないし・・
C言語やJava等では // 日本語コメント が使えるし
MS-DOSの.batファイルでも
REM 日本語コメント
が使える、Windows Script Hosting(WSH)であっても
'日本語コメント
が使えて、大抵のスクリプト言語は日本語のコメントが使えるのになぜにLinuxのシェルスクリプト
だけこんな事で悩まないといけないんだろうと・・・。
まぁOSが違うから文字コード周りのトラブルなんだろうけど・・。

382:login:Penguin
07/12/12 09:12:34 fnWAKO+5
使えるか使えないかっていうなら使えるだろ。
確実に自分しか使わないならShift_JISのようなbrain damagedな文字コードじゃなきゃ
別に何でもいいんじゃない。
しかし使ってよいか使わざるべきかというと、一般にスクリプトって
どのロケールで実行されるかわからないよとかの問題が出てくる。
あなたが出した例ではCやJavaのソースファイルはコンパイルするときの
環境が限定できれば問題ないし、DOSのバッチファイルも日本語DOSしか
考えていない。

383:login:Penguin
07/12/12 11:25:06 ytRjAEEx
>Shift_JISで書いて2バイト目に ▼ が含まれるとコメントが継続しちまうかな、

sjis だろうが何だろうがコメントの継続なんてありません。

>しかし使ってよいか使わざるべきかというと、一般にスクリプトって
>どのロケールで実行されるかわからないよとかの問題が出てくる。

コメントにロケールなんて関係ありません。


384:login:Penguin
07/12/12 11:32:57 11rQvfIz
英語くらい書けよ。

385:login:Penguin
07/12/12 12:33:25 5zz/Y7Bm
っつか、どういう環境(=人間環境)だか知らないけど、
そんな雰囲気だと、頑張って英語でコメントを書いても、
肝心の「他の人」が、それを理解出来ない、
ということが容易に想像出来てしまうわけで、
だったらローマ字でいいじゃん、と思う。

386:login:Penguin
07/12/15 11:57:10 FOfJjZuV
>>383
コメントってのは実行されるときはロケール関係ないけど
元々読むものだから、ロケールばらばらと読みにくくて困るよね
って意味だよ。たぶんね。

387:login:Penguin
07/12/19 22:19:06 qeHYVBDH
#!/bin/bash
for i in *.txt
で、'*.txt' で展開されるリストの長さに制限はある?

ls: argument list too long になる長さでも処理できるようだが、他に何か別の制限はある?

388:login:Penguin
07/12/20 18:50:14 Qtkk7tpx
sedについての質問です

aaa
bbb
ccc

という出力を、sedコマンドで一行にしたいのです。
aaa bbb ccc このように。
どうしたらよいですか。

逆の、sed -e 's/\ /\n/g' はできるのですが。

389:login:Penguin
07/12/20 21:20:24 1r8qT2Sh
awkなら
$ (出力するコマンド) | awk '{printf("%s ", $0)}'
でできるんだけどなぁ

390:login:Penguin
07/12/20 21:47:48 p9kMPhFx
$ cat input
aaa
bbb
ccc
$ sed -n 'H;${g;s/¥n/ /g;s/^ //p;}' input

なんか無様だ。きっともっとスマートに出来るに違いない。


391:login:Penguin
07/12/20 21:49:27 p9kMPhFx
もし各行が空白文字を含まないなら、
echo `cat 元テキスト` > 新テキスト
でいいな。



392:login:Penguin
07/12/20 22:14:22 IRXLh3Ok
>>388
sed ':loop; N; s/\n/\ /g ;$!b loop' hoge

393:login:Penguin
07/12/20 22:19:20 UDgG5/dT
sedにこだわらなければ
tr -s '\n' ' ' < input
とか


394:login:Penguin
07/12/20 22:28:20 p9kMPhFx
目的によっては、
$ fmt input

fmtってUNIX標準?


395:login:Penguin
07/12/20 22:39:06 Qtkk7tpx
>>389-393
こんなにレスが来るとは。
皆さんありがとうございます。

すべて試してすべてで出来ました。
echoとtrはなるほどという感じです。
他は知りませんでした。レベル1アップですね。

396:login:Penguin
07/12/20 22:43:02 Qtkk7tpx
>>394
更新遅れた。
できました。オプションすらいらないとは。

397:login:Penguin
08/01/06 19:04:19 tfZRITK8
awkで
awk '{print $2,$3}' とすると2,3番目が表示されますが
二番目以降全て表示するにはどうすればいいのでしょうか?

398:login:Penguin
08/01/06 19:44:21 TN85yzo6
awk 'gsub($1,"")'

399:login:Penguin
08/01/06 21:41:07 HrtO6pOF
$1に特殊文字が入れられると思わぬ結果になりそうな気がする。

400:login:Penguin
08/01/06 21:53:19 xjxCtnUs
awk '{for (i=2;i<=NF;i++){printf($i" ")}}'

401:login:Penguin
08/01/06 22:56:50 HrtO6pOF
フィールド区切が複数のスペースやタブコードでも、1個のスペースに置換されてしまう気がする。
>>397の「全て」がそこまで求めているかは分からないが。

402:login:Penguin
08/01/07 00:59:34 Lq+3ioDo
>>401
awk -Fなにか  '{for (i=2;i<NF;i++){printf("%s%s", $i, FS)};print $NF}'

403:397
08/01/07 02:29:17 SZZlXYY6
ありがとうございます。
最初 >>387 さんと同じことを思ったのですが他に
オプションか何かで用意されていると思ってました。
402さんのを使わせていただきます


404:397
08/01/07 02:29:58 SZZlXYY6
s/387/398

405:login:Penguin
08/01/07 17:21:59 CzyB4/IB
>>402
これだと複数の空白が一つになって表示される



406:login:Penguin
08/01/07 18:30:26 DBTZ8VT2
awk '{gsub($1, "");print substr($0,2)}'


407:login:Penguin
08/01/07 18:59:30 AGg2gknU
hint:
aho,choaho,kusoaho,doaho

awk '{print substr($0,length($1)+2)}'



408:login:Penguin
08/01/07 20:07:07 81ckgAQ5
個人的には>>398をアレンジして、
gawk 'gsub(/^[[:blank:]]*[^[:blank:]]+/,"")'
かな。

409:login:Penguin
08/01/07 20:13:04 DBTZ8VT2
なんだ>>398で既出だったのね。見落としスマソ。

410:login:Penguin
08/01/07 23:07:24 6d+dex8H
[file1]
bar=234

[file2]
foo=123
Bar=987

と2つのkey=valueな内容が入ってるファイルがある。ここで、file1には
ないがfile2にはあるkeyのみ(case-insensitiveな比較で、また、valueは
違っていてよい)を拾いkey=valueを出力したいのだけど、一行で書けないかな?

どういう出力になってほしいかというと

 $ myuniq --split-char='=' --field-index=1 --print-unique file1 file2
 foo=123

というような実行イメージ。awkで

awk -F= '{ line[toupper($1)]=$0; seen[toupper($1)]++; } END { for (key in line) if (seen[key] == 1) print line[key]; }' file1 file2

みたいなのはでっち上げたんだけど、正直汚い。


411:login:Penguin
08/01/07 23:30:18 6RYIn4eu
回答じゃなくてすまんのだが、最後にあるワンライナーだと、
2ファイル通して1回しか現れなかったものを表示するから、
「file1にはないがfile2にある」ものだけでなく
「file2にはないがfile1にある」も出てこないか?


412:login:Penguin
08/01/07 23:35:18 6RYIn4eu
負けず劣らずかっこ悪いシロモノ

for w in `cut -d= -f1 file1 file2 |tr A-Z a-z|sort|uniq -c|sed -n 's/ 1 *//p'`; do grep "^$w=" file2; done


413:login:Penguin
08/01/07 23:52:40 DBTZ8VT2
grep -v -i "`cut -d= -f1 file1`" file2

重複は無考慮


414:login:Penguin
08/01/07 23:54:29 6d+dex8H
>>411
あ、すみません。バグです。が、元の仕様が厳しすぎで、

 どちらかにしかないエントリを出す

でも大丈夫でした。

 file1かfile2のどちらかにのみあるkeyに対応するkey=valueを出力する

に仕様を訂正させてください。

何をしたいのかというと、Windowsの環境変数を手元のUNIXな環境に
取り込みたいのですが、その際に自分で定義している分については
上書きされないようにしたいのです。

hostA$ env > hostA.env
hostB$ env > hostB.env
hostB$ myuniq ... hostA.env hostB.env > diff.env
hostB$ . ./diff.env

みたいなことをしたいと。で、片方の環境が Windows なもので、
case insensitiveな比較とかも必要になってます。

行全体ではなく特定のフィールドのみ見て uniq/diff 処理して出力って
簡単そうで微妙に面倒です。

415:login:Penguin
08/01/07 23:59:58 6d+dex8H
>>413
おおー。grepのexprに改行入れるとそんな動作になるとは!
エレガントです。勉強になりました mOm

416:login:Penguin
08/01/08 18:35:59 0P1F18Bp
1行で2つのコマンドを実行するときに
2つ目に実行したコマンドに、1つ目に実行したコマンドの引数を
そのまま渡したい場合の記述方法がわからず、困っています。

$ vi hogehoge; echo ??
*??が不明箇所*

上記の例の場合は2つ目に実行しているecho文の出力結果でhogehogeを表示させたいのですが。。
対処方法はないでしょうか?
よろしくお願いいたします。

417:login:Penguin
08/01/08 18:38:30 k6k1za9N
>>416
i="hogehoge"; vi $i; echo $i
じゃだめなん?

418:416
08/01/08 19:34:39 0P1F18Bp
>>417
ありがとうございます。
その方法があったことに気づきませんでした。
おかげで解決しました、感謝です><

419:login:Penguin
08/01/08 23:12:30 OqUgF6yk
vi hogehoge; echo !$

420:login:Penguin
08/01/08 23:26:00 5sg6/WvN
>>419
それタイプしたタイミングではまだ!$は前行のコマンドの。


421:login:Penguin
08/01/08 23:33:15 A2IkwjEN
引数が一つだけなら

vi hogehoge; echo $_

でもいけるな。

422:login:Penguin
08/01/10 13:02:51 9dVYtTPe
cshからJavaを呼び出すシェルを作成しています。

その呼び出したJava内部で例外が発生した場合、
以降のシェルの処理を続行させたくありません。

どの様にすればよいのですか?
Javaのcatch節でSystem.exit(1);とかで処理を終了させて、
cshでそれを検知する方法があるのかなぁ?
と漠然には思うのですが・・・


423:login:Penguin
08/01/10 19:51:46 qThypT9T
>>422
System.exitが何をするのか分かっているなら、
Javaコマンドの終了値を普通にifなりswitchなりで受けて、csh側からもexitすれば良いだけでは?
単純に例外=即終了と決め打ちなら良いけど、例外によって複数の処理をさせたくなると、
System.exitの終了値を多数用意して管理しなければならなくなって面倒だけどね

ここからはポリシーの問題になるけど、System.exit等を使ってコマンドの終了値を利用するよりは、
どんな例外で終了したのかを前もって文字列等でstderrにでも吐き出したり、
終了した例外を表すような長さゼロのテンポラリファイルでも作ってから、Javaコマンドの方を終了させておいて、
csh側からは、むしろその文字列やファイル名を評価させてexitさせるようにした方が、後からデバッグする時とかは楽だよ

更に言えばシェルプログラミングにcshを使うのは止めるべき
URLリンク(www.klab.ee.utsunomiya-u.ac.jp)
URLリンク(www.klab.ee.utsunomiya-u.ac.jp)

424:login:Penguin
08/01/10 21:50:31 CJRDs9Ag
Javaのポリシーは知らないが、エラーメッセージと終了コードは二者択一せにゃならんものではない気がする。

425:login:Penguin
08/01/11 14:14:06 mrGJLB/g
>>423、424
ありがとうございます。

シェルスクリプト自体、経験が浅い上に今回の要望がcshというのが
決まっているもので・・・
困っています。。。
2chでの質問自体も初めてなもので・・・

準正常として扱うような例外は全てJava側で処理をしてプログラムは
正常終了として扱っています。
処理続行不可能と判断した、ランタイム系やIO例外などが発生した場合は
後続のシェルを流したくない。
という状況です。



if $JAVA_CMD
then
続き
else
exit 1
fi

以下処理続く
・・・
ってな感じにしたのですが、どうも上手くJavaでexitした値が取れないです。
文法が間違っているのですかね?
もう少し調査してみますが、上記の書き方で間違いがあればご指摘頂きたいです。

後は教えていただいた、テンポラリファイルでの判断も考えてみます。


426:login:Penguin
08/01/11 15:11:54 GLHvzQDj
findコマンドの結果をツリービュー(treeコマンドの結果的なツリー表示)で出すコマンドまたは方法ってありますか?

427:login:Penguin
08/01/11 16:08:44 6CIbL1kG
>>425
cshなら

$JAVA_CMD
if ($? != 0) then
  echo "failed"
  exit $?
endif

echo "OK"

でどう?

428:login:Penguin
08/01/11 16:55:30 mrGJLB/g
>>427
ありがとうございます。
教えていただいた方法で、想定通りの動作になりました。


429:login:Penguin
08/01/11 21:11:49 OPXAXUzh
>>426
普通にtreeコマンド使うんじゃだめなん??
findで絞った結果を出したいのかなぁ。


430:login:Penguin
08/01/11 22:17:07 4hqMEkJ5
grep -f find結果 tree結果
とか。

# 本気にしないように。

431:login:Penguin
08/01/11 23:02:21 aloediIm
基本的にはtree | grep なんちゃら でいいんじゃね?

432:login:Penguin
08/01/14 11:50:49 3iR1bkH0
画像の特定の領域だけを一括でぼかしたいのですが
いい方法はありませんか?

433:login:Penguin
08/01/14 12:00:15 ZjONjaHo
つ netpbm



434:login:Penguin
08/01/14 12:12:55 6n5zEajJ
つimagemagick


435:login:Penguin
08/01/14 14:01:26 Or9vH7Fn
メールアドレスの@以降の最後の国を表すCountry Codeの部分だけを抜き出すには
どのような正規表現を使えば良いでしょうか?

@hotmail.co.jp の.jp の部分を見る感じです。
.jp以外は無視する、という感じです。これで日本のメールしか相手にしない事になりますよね。

436:login:Penguin
08/01/14 14:04:07 ZjONjaHo
spam避け?

日本からも.comや.netや.orgや.infoや.bizや.acや.tvや.toや(以下略)の
アドレスでメールが送られることはあるぞ。


437:login:Penguin
08/01/14 14:04:25 Or9vH7Fn
$.jp

↑これでいいんでしょうか?正規表現全く知らない状態でネットでちょっと検索してみたのですが・・・

438:login:Penguin
08/01/14 14:05:05 Or9vH7Fn
あっちゃー、そうなんですか・・・
海外のメールを相手にしない方法って無いんですかね・・・
英語でViagraとかうるさいんですよ。

439:login:Penguin
08/01/14 14:17:08 6n5zEajJ
/[あ-ん]/?
ひらがながないメールは無視してもよかろう。

440:login:Penguin
08/01/14 14:37:34 FCIPzPAY
ヘッダの Content-Type を見て弾くとかどうよ?

^Content-Type: .*iso-2022-jp


441:login:Penguin
08/01/14 14:42:36 6n5zEajJ
最近はutf-8なのも多いよ。


442:login:Penguin
08/01/14 14:54:07 JtG94m55
utf-8 は違法で、危険運転致死罪が適用になるんじゃ?

443:login:Penguin
08/01/14 22:54:28 RfE0b+o0
>>437
\.jp$

では?

444:login:Penguin
08/01/16 13:17:12 ZRO/FTzi
テキストファイルを、最後の3行を除いて出力したいのですが
何か良い書き方はないでしょうか。
sed '$d' xxxx | sed '$d' | sed '$d' と書くくらいしか思い付かなくて。

445:login:Penguin
08/01/16 14:26:14 1obpvu1A
>>444
head -n -3 foobar.txt

446:login:Penguin
08/01/16 17:01:38 IKqjky5V
awk '{a[NR]=$0}END{for(j=1;j<=NR-3;j++) print a[j]}' a.txt

447:login:Penguin
08/01/16 18:25:12 ZRO/FTzi
>>445
head のオプションは見落としてました…ありがとうございます

448:login:Penguin
08/01/16 21:56:01 KAlEWwYc
ランダムな数字が欲しいとき,どうするのが簡単?
1. $$
2. $RANDOM
3. /dev/urandom
4. 時計
あたりを思いついたんだけど

449:login:Penguin
08/01/16 22:14:57 yh54UVVr
ワシは、ランダムな数字の用途により生成手段を変えてるような気がする。

450:login:Penguin
08/01/16 22:16:21 KAlEWwYc
1. 偏りそう
2. bash依存
3.4. 面倒
という問題点があるから,誰かいい方法教えてくれないか?

451:login:Penguin
08/01/16 22:19:14 KAlEWwYc
>449 たしかに用途によって求められる強さが違う気がする.
とりあえずこうしとけ的な汎用的な方法はないんかな.
いちばん手軽な方法が知りたい

452:login:Penguin
08/01/16 22:47:32 HQvmxN1E
>>448

$$はスクリプト内で複数個必要だと使えない罠
dateのmanを見ていたら、

 %N nanoseconds (000000000..999999999)

というのがあった。こんな感じ

% echo -n `date +%N`
431218994 % echo -n `date +%N`
857494685 % echo -n `date +%N`
269031777 % echo -n `date +%N`
803351248 % echo -n `date +%N`
195538275 % echo -n `date +%N`
538357509 % echo -n `date +%N`
058776188 %

453:login:Penguin
08/01/16 23:09:59 PJonPFmQ
jotはたぶんBSD系限定だよな。
jot -r 10 1 6


/dev/urandomは10進数テキストで得るのがめんどーだろうか。
dd if=/dev/urandom bs=2 count=1 2>/dev/null | od -vd

左カラムがじゃまだな。 sed 1q |cut -f2 -d' ' とかで削るか。




454:login:Penguin
08/01/16 23:21:36 KAlEWwYc
>452,453
なるほど.date +%Nはいい感じ.
jot便利そうだよ,jot.犬にもこんなの欲しいな.
ありがとう

455:login:Penguin
08/01/16 23:24:18 HQvmxN1E
od -t u1 /dev/urandom | awk '{print $2;exit}'

456:login:Penguin
08/01/16 23:33:28 PJonPFmQ
r=`fortune | md5sum - | sed 's/^¥(........¥).*/¥1/'`
r=`printf %d 0x$r`

ごめんなさいごめんなさい。


457:login:Penguin
08/01/16 23:51:47 puzD1M+G
普通に perl -e 'print int(rand(1000))' じゃダメなの?(perl5前提だけど)



458:login:Penguin
08/01/16 23:55:16 KAlEWwYc
>457 これだけのためにperlやawkを出してきたくないという貧乏心があってwww

459:login:Penguin
08/01/17 01:30:17 xe77Y4ah
時は金なり、というじゃない

460:login:Penguin
08/01/17 01:45:37 hGbWYs9C
つーか、乱数ってこれだけのため、っていうほど簡単なものじゃないと思う。
そういうものが必要な処理はシェルじゃなく、ちゃんとそれなりの言語でプログラムしたほうがいいかも。

461:login:Penguin
08/01/17 09:08:26 MJ2pzO6M
確かに簡単な乱数ならともかく、ちゃんとした乱数が欲しい処理は言語引っ張り出したほうが良いかもね

462:login:Penguin
08/01/17 09:18:44 wcByJn9i
% i=0; while [ $i -lt 1000 ] ; do echo "$i "`date +%N`; i=`expr $i + 1`; done \
    | awk '{hist[int($2%10)]++} END{for (i in hist) {printf("%2d %5.2f%\n",i, hist[i]/NR*100) }; exit}' | sort -k1n
0 9.70%
1 10.70%
2 8.60%
3 11.00%
4 10.40%
5 8.90%
6 11.40%
7 9.70%
8 9.80%
9 9.80%
(´・ω・`)

% i=0; while [ $i -lt 1000 ] ; do echo "$i "`date +%N`; i=`expr $i + 1`; done \
    | awk '{hist[int($2%10)]++} END{for (i in hist) {printf("%2d %5.2f%\n",i, hist[i]/NR*100) }; exit}' | sort -k1n
0 9.20%
1 12.30%
2 8.60%
3 11.00%
4 11.20%
5 9.30%
6 11.40%
7 7.80%
8 11.40%
9 7.80%
(゚д゚)

463:login:Penguin
08/01/17 09:28:02 wcByJn9i
% od -t u1 /dev/urandom \
    | awk '{hist[int($2/256.0*10)]++} NR==1000{for (i in hist) {printf("%2d %5.2f%\n",i, hist[i]/NR*100) }; exit}' | sort -k1n
0 9.80%
1 9.50%
2 10.10%
3 9.80%
4 9.80%
5 9.40%
6 10.20%
7 10.20%
8 10.30%
9 10.90%
(´・ω・`)


% perl -e '$MAX=10;$LOOP=1000000; for (1...$LOOP) {$hist[int(rand()*$MAX)]++}; for (0..$MAX-1) {printf("%2d %4.2f%\n", $_, $hist[$_]/$LOOP*100) }'
0 9.98%
1 9.99%
2 9.99%
3 10.02%
4 10.03%
5 10.02%
6 9.92%
7 10.00%
8 10.00%
9 10.04%
(゚∀゚)

date +%Nは、ばらつきはともかく遅いな...

464:login:Penguin
08/01/17 10:59:36 bFGNQCBf
遅いのは date +%N じゃなくて while のループだと思うよ。

465:login:Penguin
08/01/17 11:37:17 LfhUWWyD
>>450
> 2. bash依存
ksh88由来らしい
URLリンク(www.cs.princeton.edu)
ksh互換を期待できるなら使ってもいいんじゃね

466:login:Penguin
08/01/18 01:58:10 S6Zw/ddB
/usr/games/random -e 100; echo $? は?

467:login:Penguin
08/01/18 07:42:17 YTGcRcKS
>>466
/usr/gamesってそれ何年前のWSのディレクトリ構成だよ...

468:login:Penguin
08/01/18 17:40:50 wVas3OI3
findの検索結果でディレクトリの場合は最後に「/」をつけさせたいのですが、いい方法はあるでしょうか?


469:login:Penguin
08/01/18 17:50:43 YTGcRcKS
find . -exec ls -Fd {} \;

470:login:Penguin
08/01/18 22:33:39 EJvy1m4k
>>468
find (検索ディレクトリ) -type d -printf "%p/\n" -or -print


471:login:Penguin
08/01/18 22:55:09 S6Zw/ddB
>>467
最新のLinuxの(いやほんと。これだけは伝統的理由で残ってるのかな)

472:login:Penguin
08/01/18 23:22:22 6BHP4h96
>471 鳥は?

473:login:Penguin
08/01/19 01:14:55 ZLNpfSkQ
>>472
Debian (sid)。まあ bsdgames とかまんまレガシーなパッケージだけだけどね。


474:login:Penguin
08/01/19 05:58:20 JWtUz7T2
Debian etch にも/usr/games はあるな。
中みたらbannerとfortuneが入ってた。

475:login:Penguin
08/01/19 08:07:34 njld/y5g
シェルスクリプトの本で実用例の多い本ってありませんか?

476:login:Penguin
08/01/19 17:07:33 NuJUp+KH
Fedora4を使っています
/start.txt内の記載が
12
254
3678
4
59
621
78
896
、、、、、、
と法則性の無い桁数の数字が2000行近くあるものを
/end.txtに
12,254,3678,4
59,621,78,896
、、、、
A,B,C,Dと4項目で1行に変換したいと思っています

start.txtから4行抜き出して end.txtに1行にする考え方でいい方法を教えていただけないでしょうか
よろしくお願いいたします


477:login:Penguin
08/01/19 18:46:40 ZLMZWyE0
cat /tmp/test.txt | awk 'NR%4{printf("%s,",$0)} !(NR%4) {print $0} '

余りが出たら最後カンマ付きで出力されちゃうけど

478:login:Penguin
08/01/19 18:55:41 NuJUp+KH
>>477
完璧な物ありがとうございます
今迄sedばかり使っていたのですがawkすごいですね

awkの勉強させていただきます

479:login:Penguin
08/01/19 18:59:10 IrN8xoLt
>>477 あらupしようとしたら同じだったわ。
awk '{printf"%s%s",$0,(NR%4?",":"\n")}' < start.txt

480:login:Penguin
08/01/19 19:02:55 NuJUp+KH
>>479
ありがとうございました
とても参考になります

481:login:Penguin
08/01/19 19:43:02 rxOILVvf
vi start.txt
q94J↓q10000@9
:%s/ /,/g
:w end.txt


482:login:Penguin
08/01/19 19:59:13 58USgOmq
>>473-474
Debianではゲームの実行バイナリは/usr/gamesに置かれるぜ。
最近はポリシーチェッカも警告を出すようになったから、lennyまでには移動完了するんじゃね。
URLリンク(lintian.debian.org)
URLリンク(lintian.debian.org)

483:login:Penguin
08/01/19 21:00:37 ZLNpfSkQ
>>482
なんでだろうね?
FHS誤解してたかと読み直したらそんなことないし。理由がわからん。

484:login:Penguin
08/01/19 21:04:24 ZLNpfSkQ
ごめん上は嘘。Debian Policy には

 As described in the FHS, binaries of games should be installed in the directory /usr/games.
 This also applies to games that use the X Window System.
 Manual pages for games (X and non-X games) should be installed in /usr/share/man/man6.

とか書いてあった。FHSをgrepしたら、正式なセクションはないが、optionalとしてgames作っていいと
書いてあった。

485:login:Penguin
08/01/19 21:14:55 Xt/fDApd
FHSとかグローバリゼーションとか国際化とか
そういうのが全て悪の元凶。

486:login:Penguin
08/01/19 22:06:40 ZLNpfSkQ
FHSは/usr/localと/etcを綺麗にしてくれる。
それだけでも推進されてしかるべき。

487:login:Penguin
08/01/20 02:02:52 dexE1e0m
/usr/gamesはオプションなのに、/usr/local/gamesは必須扱いなところを見れば分かるとおり
ディトリビュータはゲームなんか提供すんな、ということなのだよ。

つまりゲームを提供しているDebianは人々を堕落させる悪のディストリビュータなのだ!

488:login:Penguin
08/01/20 02:23:04 kH+ebKTA
>>487
なにその陰謀史観(w

単に /usr/ 直下はディストリの管轄だし自分で決めろ、
一方で /usr/local/* は空フォルダ切っておく以上は認められないから
代わりとして、せめて誘導できるように切っておけ、ということかと。

FHSで自分的に従来慣習と比較して見慣れないのは/srvだな。
どこのUNIXでの慣習だったんだろう?


489:login:Penguin
08/01/20 02:55:38 M1QHfiRt
つっこみどころは
/usr/games/bin/fortune じゃなくて
/usr/games/fortune ってとこじゃなかったのかー

490:login:Penguin
08/01/20 04:01:16 FZKKsnAp
>>476
sed ':b;1~4,+2{N;s/\n/,/;bb}'

sedも心の片隅にでも置いておいてやってくだされ。


491:login:Penguin
08/01/20 04:20:45 IwRos1VB
>>489
管理者のPATHからゲーム関係を除外するのが目的だろうから
/usr/games/binとサブディレクトリを掘る必要はないんじゃね。

492:login:Penguin
08/01/21 02:31:10 HJiECvMS
>>490
そんな記法初めて見た…
どうなってんの???

493:login:Penguin
08/01/21 02:55:10 QTxOOwHl
アドレス指定がGNU拡張?

494:login:Penguin
08/01/21 11:41:48 JvqHER/W
>>476
paste -d, - - - -

paste も心の片(ry


495:login:Penguin
08/01/21 14:42:32 svPtjQeo
次のようなファイルがあるとします。

$ cat name.txt
name1
name2
name3
name4
name5

$ cat weight.txt
weight1
weight2
weight3
weight4
weight5

このとき、なんとかして
$ ???????????
name1 weight1
name2 weight2
name3 weight3
name4 weight4
name5 weight5
と表示したいのですができません。
最初は
$ cat name.txt weight.txt > data.txt
$ awk '{ if(NR<=5) a[NR]=$0; else b[NR-5]=$0} end{for(i=1;i<=100;i++) printf i,a[i],b[i];}' data.txt
としましたが、空白が表示されるだけでした。

496:login:Penguin
08/01/21 14:51:31 N+zVQlnl
>>495
paste

497:login:Penguin
08/01/21 14:53:35 svPtjQeo
>>496
ありがとうございました。
ぐぐるまでもヘルプ読むまでもなく、
適当にいじっただけでそうなりました。

498:login:Penguin
08/01/22 11:11:17 DOTIpHDE
gawk 'FILENAME != old {i=0;old=FILENAME} {data[i++] = data[i]" "$0;} END{for(j=0; j<i; j++)print data[j]}' name.txt weight.txt
gawk 'FILENAME != old {i=0;old=FILENAME} {data[i++] = data[i]" "$0;} END{for(j=0; j<i; j++)print data[j]}' name.txt weight.txt height.txt

ファイル数に制限はない。あと出力される行数は、最後のファイルの行数によって決まってしまうがな。

499:login:Penguin
08/01/25 13:18:49 u9KTnE0i
ランダムに壁紙を表示するスクリプト作ってみました
一応予想通りに動いてるようですが問題点や改善点があったら叩いてくだしあ

#!/bin/sh

EXT='.jpeg$|.jpg$|.png$'
LIST=`ls $1 | grep -Ei $EXT`
if [ "$LIST" = '' ] ; then\
echo "No files found in $1."
exit
fi
NUM=`echo $LIST | wc -w`
N=`expr $RANDOM % $NUM + 1`
TARGET=`echo $LIST | cut -d ' ' -f $N`
#echo "$1/$TARGET"
bsetbg $1/$TARGET

500:login:Penguin
08/01/25 15:41:59 5ugSsaO2
>>499
そのままだと画像ファイル名やパスに空白があると動かないけど、いいのか?

501:login:Penguin
08/01/25 17:04:10 HizVC3Pf
#!/usr/bin/python
import sys, os, random
def is_image(filename):
    EXT = ('jpeg', 'jpg', 'png')
    return any(filename.endswith(ext) for ext in EXT)
if sys.argv[1:]:
    dir = sys.argv[1]
else:
    dir = os.path.curdir
files = filter(is_image, os.listdir(dir))
if not files:
    print "No images found in %s" % dir
    sys.exit(1)
target = random.choice(files)
os.system("echo bsetbg '%s'" % os.path.join(dir, target))
# 高級言語って素晴らしいね

502:login:Penguin
08/01/25 17:51:17 u9KTnE0i
>501 ちょwwスレタイwww
修正してみました

#!/bin/sh

EXT='.jpeg$|.jpg$|.png$'

if [ "$1" = '' ] ; then\
DIR=`pwd`
else\
DIR="$1"
fi
LIST=`ls "$DIR" | grep -Ei "$EXT"`
if [ "$LIST" = '' ] ; then\
echo "No files found in $DIR."
exit
fi
NUM=`echo "$LIST" | wc -w`
N=`expr "$RANDOM % $NUM + 1"`
TARGET=`echo "$LIST" | cut -d ' ' -f "$N"`
#echo "$DIR/$TARGET"
bsetbg "$DIR/$TARGET"


503:login:Penguin
08/01/25 18:55:56 u9KTnE0i
>502 事故レス
expr はクオートしちゃまずかった

504:login:Penguin
08/01/26 00:32:05 0LMYrtfF
個人的には NUM= 以降を配列でやらせることが多いので、わりと bash を使う。

#!/bin/bash
DIR=$1
IFS='
'
TARGET=(`find "${DIR:=.}" -maxdepth 1 \( -name '*.[Jj][Pp][Ee][Gg]' -o -name '*.[Jj][Pp][Gg]' -o -name '*.[Pp][Nn][Gg]' \)`)
if [ ${#TARGET[@]} -eq 0 ]; then
        echo "No files found in ${DIR:=.}"
        exit -1
fi
#echo ${TARGET[`expr ${RANDOM} % ${#TARGET[@]}`]}
bsetbg ${TARGET[`expr ${RANDOM} % ${#TARGET[@]}`]}

とか。

505:login:Penguin
08/01/26 00:54:55 a+SvfS+1
>>504
おまいさんの find には -iname は無いのか?
あと、bash なら自前で算術計算できるよ

bsetbg "${TARGET[RANDOM % ${#TARGET[@]}]}"

506:login:Penguin
08/01/26 01:31:49 Gp61cAWI
>おまいさんの find には -iname は無いのか?
あ、これは知らんかった。有り難う。
>あと、bash なら自前で算術計算できるよ
こちらは知っていたけど、元ネタに合わせんと。

507:login:Penguin
08/01/26 11:11:47 NixStw3D
#!/bin/sh
filesize=('du -h ~/file.tmp')
$loglen > ~/filesize.txt

という感じでfile.tmpのファイルサイズを出力したいのですが
出力結果に不要な部分があります。
欲しい部分だけ切り取るには、どうすればいいでしょうか?
よろしくお願いします。

100k /home/user/file.tmp
~~~~~  ~~~~~~~~~~~~~~~~~~~~
 ↑         ↑
欲しい     要らない部分

508:login:Penguin
08/01/26 11:20:53 NixStw3D
#!/bin/sh
filesize=('du -h ~/file.tmp')
$filesize > ~/filesize.txt

間違えてしまいました。こんな感じです。

grepで抽出するオプションの書き方も思い付かず
スクリプトで処理するには・・・?と、行き詰まってます。

509:login:Penguin
08/01/26 11:34:50 opXPKDAo
>>508
cut (coreutils)

510:login:Penguin
08/01/26 11:48:51 NixStw3D
>>509
ヒントありがとうございます。
使い方を調べてみます。

511:login:Penguin
08/01/26 12:47:23 NixStw3D
>>509
もう少しヒントをください。

cat と coreutils のどちらかを使うや
cat か coreutilsのどちらかを使うかや
レスの意図を示していただけるとありがたいです。

シェルスクリプト歴数時間で理解が及ばなく申し訳ないです。

512:login:Penguin
08/01/26 12:52:39 K0Rp0izE
>511 ちょっとでもぐぐってみたのかと.
あと猫じゃなくて切るほうな.

513:login:Penguin
08/01/26 13:12:20 NixStw3D
>>512
調べてみたのですが、広範囲になってきて混乱してきました。

今のところ
cat -Tというオプションと、rtというコマンドを発見して

コンソール上で
du -h /home/user/file.tmp|cat -T|tr "^I/home/user/file.tmp" " "
とすると、ファイル数だけ表示されるようになったので
うまい方法でもないような気もしつつに

#!/bin/sh
filesize=('du -h /home/user/file.tmp|cat -T|tr "^I/home/user/file.tmp" " "')
$filesize > ~/filesize.txt

としてみたのですが
$./filesize.sh
↓うまく実行できずに困っています。
du: invalid option -- T
du: invalid option -- |
du: invalid option -- t
du: invalid option -- r
詳しくは `du --help' を実行して下さい.

514:login:Penguin
08/01/26 13:15:18 K0Rp0izE
>513 catじゃなくてcut.たぶんこれ一発でやりたいことはできると思うから調べてみな.

515:login:Penguin
08/01/26 13:22:31 NixStw3D
>>512,514
ありがとうございます。
素で間違えていました。

調べてみます。

516:login:Penguin
08/01/26 13:24:02 ShBosd97
stat -c %s
ではだめなのか

517:login:Penguin
08/01/26 13:43:18 NixStw3D
コンソールで
$ du -h /home/user/file.tmp|cat -T|cut -d ^ -f 1
としたらうまくファイルサイズだけ切り出せたので

#!/bin/sh
filesize=('du -h /home/user/file.tmp|cat -T|cut -d ^ -f 1')
$filesize > ~/filesize.txt

と、してみたのですが
なにか基本的な構文がおかしいのでしょうか?
バックスラッシュやシングル、ダブルクォーテーションを試してみましたが回避できません。

du: invalid option -- T
du: invalid option -- |
du: invalid option -- u
du: invalid option -- t
du: invalid option -- d
du: invalid option -- f
詳しくは `du --help' を実行して下さい.

>>516
ヒントありがとうございます。
調べてみます。

518:login:Penguin
08/01/26 14:22:43 /buRKO/4
>>517
これでいいだろ。
du -h /home/user/file.tmp | awk '{print $1}' > ~/filesize.txt

519:login:Penguin
08/01/26 16:30:30 NixStw3D
>>518
調べたらawkは強力で、いろいろ使えそうです。
出力も当初の予定通りで完璧でした。
ありがとうございます。

結果を変数に代入出来なくなりましたが、構文を参考に>>517を直したら同様の出力結果で動きました。
#!/bin/sh
du -h /home/user/file.tmp | cat -T | cut -d ^ -f 1 > ~/filesize.txt

>>516
>>518さんを参考に手を入れたらキロバイト表示もできました。
ありがとうございます。

ただ、数字の後ろに「k」を入れる方法が判りませんでしたが。
#!/bin/sh
stat -c %s /home/user/file.tmp | awk '{printf "%s" ,$1/1024}' > ~/filesize.txt


520:login:Penguin
08/01/26 16:43:00 /buRKO/4
>>519
stat -c %s /home/user/file.tmp | awk '{printf "%sk" ,$1}' > ~/filesize.txt


521:login:Penguin
08/01/26 23:58:52 NixStw3D
>>520
応用ありがとうございます!
感謝。

522:login:Penguin
08/01/29 13:18:07 8n8HPqGB
columnコマンドがない環境でインデント合わせをしたいのですが、
何か良い方法はあるでしょうか?

523:login:Penguin
08/01/29 15:57:53 8n8HPqGB
lsコマンドで、ファイルのatimeやctimeを取得する方法はあるでしょうか。
HP環境なので、Linuxのstatコマンドがなくて途方にくれています。

524:login:Penguin
08/01/29 16:05:29 qGMFgswu
>>523
Linux の話じゃないなら板違い。

525:login:Penguin
08/01/29 16:33:43 yAbAmnAs
ファイルから目的の行を削除して上書きしたいとき,
sed -e 2d file >tempfile
mv tempfile file
のようにすればできるんですが,テンポラリファイルを使わない方法はありますか?

526:login:Penguin
08/01/29 16:37:12 qGMFgswu
>>525
GNU sed なら -i で。

527:login:Penguin
08/01/29 21:52:45 6iHka9Si
リダイレクトとサブシェルを駆使してうまいことinplace editをやる技が
あったはずなんだがどうやってぐぐればいいかわからん。


528:login:Penguin
08/01/29 23:11:45 k/ZizWnP
つ named pipe

529:login:Penguin
08/01/30 00:25:54 /azTEfDv
こんな感じのやつか?

 $ echo hoge > hoge
 $ (rm hoge; (echo fuga; cat) > hoge) < hoge

要はサブシェルに開かせておけば中で上書きしても内容は
デスクリプタから参照できるからそれでin-place処理できるって奴だな。

上は手抜きだけど、どっかのFAQにデスクリプタ付け替えまくりの例題が
載ってたのだけ覚えてる。csh-whynot文書あたりかも?


530:login:Penguin
08/01/30 00:35:03 KwdpVGiV
おおう、そんなかんじだったかも。thx



531:login:Penguin
08/01/30 20:21:01 6DxEwSig
すいません
ちょっと今シェルの作り方で困っているのですが

やりたいことは
一つのフォルダに入っているファイルを、ファイル名によって3つのフォルダに振り分けたいのです。
その際に、どのファイルをどのフォルダに移動するのかはシェルの中に記述するのではなく、
ファイル名の一覧が書いてあるtxtファイルを一行ずつ読んで振り分けたいのです。
ですが、作り方が今いちわかりません。

例えばA,B,Cと分かれていたら
1、Aのフォルダに振り分けるファイル名が書かれたtxtファイルを読む
2、同じファイル名がヒットしたらAに送る
3、次にBのフォルダに振り分けるファイル名が書かれたtxtファイルを読む
4、同じファイル名がヒットしたらBに送る

ファイル名が書かれたtxtファイルはA用B用C用の3種類用意します。

どうやって作ればいいのでしょうか?

532:login:Penguin
08/01/30 20:36:32 CiuX3/ZK
シェルの作り方なんぞ知るかい。

533:login:Penguin
08/01/30 20:38:30 0RlCwXSW
宿題は自分でやれ。

534:login:Penguin
08/01/30 21:41:32 wmsZ0JX8
>531
testコマンドでググレカス
ファイルの読み込み方すらわかんねーなら本一冊買って出直して来い

535:login:Penguin
08/01/30 21:48:11 6DxEwSig
うわー
冷たい
しかも叩く時だけは一気にレスがつくんだね

>>532
>>533
わからないなら無理にレスしなくていいです

536:login:Penguin
08/01/30 22:48:33 5hT959VT
さいきんの、このバカの質問な感じのには

>>わからないなら無理にレスしなくていいです

に類する文言が書き込まれる率が高いな、て思えるんだが、これは

 1. この手のバカは結局バカだから、おなじようにしか考えられない
2. 実は同じヤツが何度も釣りに励んでいる

のどちらか、ということだろうか?

537:login:Penguin
08/01/30 22:54:16 KwdpVGiV
シェルを作るのは結構高度な作業だからな。


538:login:Penguin
08/01/30 22:59:49 v0ETiHGx
>>536
真・教えて君養成マニュアルとかがどっかにあるんじゃないか?w

539:login:Penguin
08/01/30 23:01:22 sxNLHjSv
>537 最近はGUIの環境もシェルと呼んだりするらしいしね.
ところで,シェルスクリプトをシェルと略す感覚が信じられない.せめてスクリプトのほうを残すべきじゃないのか,意味的に…

540:login:Penguin
08/01/30 23:05:38 j0KqLeiL
教えてクン養成マニュアル
URLリンク(www.redout.net)

541:login:Penguin
08/01/30 23:39:48 KwdpVGiV
>>539
GUIのシェルってのはそう最近でもないと思う。
DOSSHELLとか、X68kのVS.Xとかあったじゃないか。


542:login:Penguin
08/01/31 00:54:52 5zXcU2rl
>>531
うわーきもい。シェルを作るという表現はおかしい
シェルの作り方って、VBの作り方、Javaの作り方
聞いているのと同じ。それをKY言うのは異常。

for文とifを組み合わせれてループさせれば。

543:login:Penguin
08/01/31 05:38:28 sRx07lee
>>535
>わからないなら無理にレスしなくていいです。

たぶんここの人は9割以上わかっていると思う。

544:login:Penguin
08/01/31 05:47:16 sRx07lee
やる気がおきない。
態度の豹変に腹が立つ。
mv -i `neko a.list` a
mv -i `neko b.list` b
mv -i `neko c.list` c

545:login:Penguin
08/01/31 13:37:31 zeMbksrC
>>544
単純にnukoするよりもls -1 | grep -f a.list
とかしてより分けた方が良くないか?

546:login:Penguin
08/01/31 19:50:10 /M27f8ta
for 変数名 in 10 20 30
do
echo $変数名
done
この構文の変数名ってなんでもいいんですか?
あとこれを実行すると
10
20
30
になりますよね?

547:login:Penguin
08/01/31 20:53:32 p8W84r95
>>546
変数名に使える文字は英字と数字、アンダースコアのみな。

548:login:Penguin
08/01/31 21:07:34 Ih8EaxE5
すると、うちのbashはおかしい。。。

$ for 9_var in 10 20 30; do echo $9_var; done
bash: `9_var': not a valid identifier

549:login:Penguin
08/01/31 21:49:51 g7asi3X7
もしかして>>351 == >>548なんか?
こんなところで釣りなんかすんなよ...

もし釣りじゃなくってバカなんだったら、せめてmanするとかググるセンセに聞くとか、な?

550:548
08/01/31 22:00:40 m8vTasa1
その話題では>>354だが、なぜ351と?

551:login:Penguin
08/01/31 23:25:56 g7asi3X7
>>550
う゛、勘違いとかtypoとか。いかんな、落ち着かんと。

でもってマヂレスしとくと、変数の1文字目は数字じゃダメな。

552:login:Penguin
08/02/01 20:50:34 aG/PrNJ9
kakikomi.txtというテキストファイルがあったとします。
STRING1 を含んでいて、かつ STRING2も含んでいる行だけを
印字しようとおもうのですが、
grep STRING1 kakikomi.txt| grep STRING2
くらいしか思いつきません。二度手間な気がします。
もう少しいい方法ありませんか?

553:login:Penguin
08/02/01 20:57:02 IKSH1LNN
>552 -e

554:login:Penguin
08/02/01 21:42:25 KLEwAeBF
>>552
それ前スレ(UNIX板のほうだったかも試練)で話題になったな

「STRING1とSTRING2を『順不同で』含む行をイッパツで引っ掛けようとしたら

egrep '(STRING1.+STRING2)|(STRING2.+STRING1)'

となってしまう。2個ならまだいいが、3個、4個...と増えていくと正規表現がキモいことになってしまう。
順不同という条件なら、>>552のやり方が一番シンプル

555:login:Penguin
08/02/01 22:20:29 9CGaNXUy
awk '/STRING1/&&/STRING2/' kakikomi.txt
とか。

556:login:Penguin
08/02/01 23:10:27 aG/PrNJ9
>>554,555
ありがとうございました。
最近暇なので本でいろいろ勉強してみます。

557:login:Penguin
08/02/02 02:58:37 jQtmOvcu
例えばここに置いてある松金洋子のデスクトップ用壁紙画像をターゲットとする。
URLリンク(www.sexydesktop.co.uk)
ここには全部で4ページ分48種類の松金洋子の画像がある。

## このサイトの画像はすべてデスクトップ用の壁紙を目的としているので、
## 一つの画像に関して数種類の解像度・縦横比の画像が用意されており、
## アクセスしてきた人の使っているディスプレイ解像度を検出しては、
## 最適な解像度のものを優先的にプッシュするようになっている。

## また、画像ファイルの命名ルールは非常に単純かつ形式的で、
## たとえば例に挙げた松金洋子の画像の場合、
## まず画像の名前を表す youko1 から youko48 までの48種類の画像が用意されている。
## さらにそれぞれの解像度を表す 1280x800 や 800x600 の文字列が続き、
## 最後に拡張子 .jpg が付けられている。
## 注意する点があるとすると、例えば youko48 に対して youko01 だとか、
## 1280x1024 に対して 0800x0600 といった「桁数合わせ」が一切行われていないということ。

558:557
08/02/02 02:59:35 jQtmOvcu
ここから先が質問。やりたいことは、

1). サイトがプッシュしてくるこちらのディスプレイ解像度に関係なく、
すべての画像について、解像度のより大きいバージョンを、
番号の一番若いものから古いものまで全種類取って来たい。

2). その際、取って来た画像のファイル名を修正して、
youko48 に対しては youko01 、1280x1024 に対して 0800x0600 などの「桁数合わせ」をしたい。

3). さらに、ファイル名の中の画像名を表す文字列と、解像度を表す文字列とを _ で結ぶようにしたい。
具体的には、youko11600x1200.jpg と名付けられた youko1 という画像の 1600x1200 版のファイル名を、youko01_1600x1200.jpg としたい。同様に、youko481280x1024.jpg と名付けられた youko48 という画像の
1280x1024 版のファイル名を youko48_1280x1024.jpg としたい。

以上をまとめると、参考例の松金洋子の画像で言えば、
youko11600x1200.jpg から youko481280x1024.jpg までの画像を、
youko01_1600x1200.jpg から youko48_1280x1024.jpg として保存したい。

これを実現するスクリプトをどう書けばいいでしょうか?

なお、好みのタレントの画像が何種類用意されているか(松金洋子の場合は48種類)については、
ダウンロードを開始する前に手作業で調べることとします。

559:login:Penguin
08/02/02 03:11:26 BYWZpRq/
>>557-558
まずお前が考えて出来たスクリプトをうpしろ
話はそれからだ

560:557-558
08/02/02 03:17:30 jQtmOvcu
んー、俺はスクリプトに無知だから、一から十まで全部取って来て、
後で手作業で仕分けする、みたいな超バカなことしかできんのです。
だからエロい人に教えてほしいんです。。
ダメならヒントだけでもいいので下さい。

561:login:Penguin
08/02/02 03:19:54 BYWZpRq/
>>557-558
ほらよ
っ google.co.jp

562:login:Penguin
08/02/02 07:40:21 QLk1rUEb
地道にループ回すしかないのでは
たぶんリネーム関連はperlか何か使ったほうがラクじゃね?

563:login:Penguin
08/02/02 08:38:47 VQl51rL6
2).3). youko0123456789x0123456789.jpg というファイル名はどのように整形すれば?

564:login:Penguin
08/02/02 10:16:29 2Gx0/Giv
$cat test.txt
aaaaaaaaaaaaaaaaaaaaaaaaaa
+bbbbbbbbbb
cccccccccccccccccccccccc
+ddddddddddddddd

長い行は先頭に+をつけて折り返しているという内容のファイルを

$cat test.txt
aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbb
cccccccccccccccccccccccc ddddddddddddddd

というように+の折り返しを前の行の後ろに空白付で結合させるにはどうすればいいでしょう?


565:login:Penguin
08/02/02 10:19:50 QLk1rUEb
cat test.txt | tr '\n+' ' 'とかどう?

566:login:Penguin
08/02/02 10:34:51 2Gx0/Giv
>>565
実行したら
$cat test.txt
aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbb cccccccccccccccccccccccc ddddddddddddddd
みたいになりましたが

$cat test.txt
aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbb
cccccccccccccccccccccccc ddddddddddddddd
これが出力としてほしいです。
\nと+が別で判断されているのでしょうか・・・

567:login:Penguin
08/02/02 10:37:11 QLk1rUEb
間違った.cat test.txt | tr '\n\+' ' 'で.

568:login:Penguin
08/02/02 10:39:50 QLk1rUEb
ごめん,俺嘘ばっかり言ってるから気にしないでorz

569:login:Penguin
08/02/02 10:41:24 2Gx0/Giv
>.567
同じ結果でしたw
レスありがとう!

570:557-558
08/02/02 10:50:34 jQtmOvcu
>>563
どうもです。
えー、そういう名前のファイルは存在しないので考えてもみませんでした。

>>562
もし $name$no1024x768$suffix がある時 $name$no1024x0768$suffix にせよ、
みたいなことを延々とやる、ということなんでしょうか?(←無知)
うーん。。。

571:login:Penguin
08/02/02 11:02:51 jHuzpaac
>>564

if 先頭が+じゃない then
 echo ""
else
 echo -n " "
fi

echo -n 行



572:login:Penguin
08/02/02 12:30:06 A3vIBKBi
>>564
sed 'N;s/\n+/ /;t;P;D'


573:login:Penguin
08/02/02 14:09:27 2Gx0/Giv
>>572
ありがとうございます!!

574:login:Penguin
08/02/05 19:10:25 E60rvXpx
/tmpにあるディレクトリをリストし
そこからディレクトリ名だけを切り取りたいと考えています。

/tmpには a b c というディレクトリがあるとして
$ find /tmp -type d -maxdepth 1 -mindepth 1 | xargs awk -F/ '{print $NF}'
を実行すると a だけが出力されてしまいます。
望んでいる出力は a b c なのでうまく出力されるようにしたいです。

findのみを実行すると
/tmp/a
/tmp/b
/tmp/c
と出力されることは確認しました。

申し訳ないのですが良い方法をご教授ください。

575:login:Penguin
08/02/05 19:18:42 DHgW4Gk4
find /tmp -maxdepth 1 -mindepth 1 -type d | awk -F/ '{print $NF}'
find /tmp -maxdepth 1 -mindepth 1 -type d | sed -e 's/.*\///'
find /tmp -maxdepth 1 -mindepth 1 -type d -exec basename {} \;

576:574
08/02/05 19:21:21 E60rvXpx
>>574で実行したコマンドは
$ find /tmp -type d -maxdepth 1 -mindepth 1 | xargs echo | awk -F/ '{print $NF}'
の間違いでした。

よろしくおねがいします。

577:574
08/02/05 19:22:58 E60rvXpx
>>575
望みどおりの出力を得ることができました!
早い回答感謝します。
ありがとうございます。

578:login:Penguin
08/02/06 21:11:41 Qs2nEtFk
すみません、次の表現ってどういう意味なんでしょうか
($Fはlsの結果が入る)
 if expr "$F" : '[[:alunum:]_-]\+$' > /dev/null 2>&1; then ...
 特に : '[[:alunum]_-]\+$'の箇所が分かりません

自分で調べて分かったのは
 [:alunum:]が数値を表すPOSIX準拠の文字クラスであること
 :はヌルコマンド
[]が正規表現とすると[[:alnum:]_-]\+$は以下のいずれかという意味でしょうか
 数値+$
 _+$
 -+$
だとしても前半の:とのつながりもよく分からないです..

579:login:Penguin
08/02/06 21:39:32 2Q3KS/FB
そのコロンはexpr の引数であって、パターンマッチを行わせるもの。
ヌルコマンドではない。

[[:alnum]]_-]¥+$ は、
「英数もしくは _ もしくは -」([[:alnum]]_-])の繰り返し(¥+)で末尾になる($)パターン。

つまり$Fが↑のパターンにマッチするかで判断するif文だな。
出力を/dev/nullに捨てている理由は、exprの動作を調べればわかる。





580:login:Penguin
08/02/06 22:12:35 Qs2nEtFk
>>579 ありがとうございます。やっと理解できました!
exprについては、nullまたは0を返した際に0を返すという仕様のため
/dev/nullに出力していることはすぐ分かったんですが
「:」もexprの構文だったんですね
ずっとシェルのパターンマッチの構文として「:」を調べていたため
ハマってました,thx!


581:login:Penguin
08/02/07 17:29:04 SojUAx7O
リダイレクトで先頭5行目から行末から5行目前までを出力したいのですが、
??? | head -n xx | tail -n xx 以外に良い方法はあるでしょうか

582:login:Penguin
08/02/07 18:31:29 K+RTjMO0
なにをしたいのか、君の示した例は本当に目的を満足してるのか、
もういちど確認した方がよいと思われ

583:login:Penguin
08/02/08 08:15:13 D8JF1iVI
では、headとtailは使わずに。
sed -n '5,$p' file.txt | tac | sed -n '5,$p' | tac

…意義が見出せない。。。

584:581
08/02/08 15:35:34 aAYt8gpF
>>583
sedは習ってないので提出できないんですよ
他にないですか?

585:login:Penguin
08/02/08 15:38:14 Yg3sGZTq
>>584
白紙で出せば...

586:login:Penguin
08/02/08 16:08:13 z5e2UbEF
{ read a;read a;read a;read a;tac; } | { read a;read a;read a;read a;tac; }


587:login:Penguin
08/02/08 16:57:33 rygBoGE6
習っていないと使えないって、そんな小学校じゃあるまいし

588:login:Penguin
08/02/08 19:53:27 8gRlFmfx
>sedは習wwwwってwwないのwwwで提出でwwきないんですよww
>他になwwwwいですか?www
のように、wを適当にまぶすスクリプトを誰か考えてくれ。

589:login:Penguin
08/02/08 21:34:44 Z8wDJkcZ
>>588
こんなwwのを作っwwwwてみたんwwだがww
どうだろうかwww
とりあえずwwwwちゃんwwと動いてるよwwうだがwwww
どんな例外wwがあるwwかわからんwww

#!/bin/sh

CHAR='w'

insertw() {
i=0
w=`expr $RANDOM % 3 + 2`
while [ $i -lt $w ]; do
i=`expr $i + 1`
echo -n $CHAR
done
}

while read LINE ;do
while [ "$LINE" ]; do
r=`expr $RANDOM % 6 + 2`
echo -n `echo $LINE | cut -c -${r}`
insertw
r=`expr $r + 1`
LINE=`echo $LINE | cut -c ${r}-`
done
echo ""
done


590:589
08/02/08 21:45:59 Z8wDJkcZ
初心wwww者でサーセンww
$RANDwwwwOM使wwってるのwwwで本wwww当のshではww動かなwwwいはずだけど,wwwここはwwLinux板wwwってことwwwで許wwwwしてもらえるwwよね?


591:login:Penguin
08/02/09 21:05:58 sA/Tx79N
あの~、正規表現についてお聞きしたいのですが
[a-z]で小文字のアルファベット全てにマッチですよね。
ならば
[あ-ん]でひらがな全てにマッチしますか?

592:login:Penguin
08/02/09 21:44:35 y7ESpv1X
yes

593:login:Penguin
08/02/10 00:32:01 HzElnwAK
「ぁ」はマッチしないのでは?

それはそうと、多バイト文字の正規表現って、大抵のアプリケーションで普通に使えるものなのか。
知らなんだ。

594:login:Penguin
08/02/10 01:02:27 bq0IfXwT
質問です。ファイルの対象部分に別のファイルを挿入するコマンドってありますか?

% cat file1
aaa%sbbbccc
% cat file2
ZZZ
% hoge %s file2 < file1
aaaZZZbbbccc

のような動作を期待しています。

挿入するファイルは少し長めなのでsedで置換ではできない気がしています。

awkあたりでfile1を%sが出るまで出力 -> file2を出力 -> file1の%s以降を出力
という方法を考えていますが、もし専門のコマンドがあれば教えてください。


595:594
08/02/10 01:12:39 bq0IfXwT
誤爆先でm4というのを教えてもらいました。
一旦使ってみます

596:login:Penguin
08/02/10 01:14:06 AyxHcvsn
そういうのはエディタで

597:login:Penguin
08/02/10 01:52:24 EflaE009
>>595
おまえFedoraすれにいなかったか?

598:login:Penguin
08/02/10 06:29:30 7q9QRaK3
>>594
printf "`cat file1`\n" `cat file2`

599:login:Penguin
08/02/11 23:47:20 wSzjm7y4
>>593
grep でやってみたらマッチしやがったよ。


600:login:Penguin
08/02/12 02:36:00 NhGbxXsu
文字列として検索できるということと、
全角文字も一文字として扱える、というのとでは意味がぜんぜん違う。

601:login:Penguin
08/02/13 03:57:10 Z8x6psMH
[あ-ん]と[\xe4\x1c-\xe4\x5f]ではまるで別物だしな(コードは適当)


602:login:Penguin
08/02/13 23:44:52 3LjmFUst
#スレ違いだが。
MS-Windowsとの可搬性に最も富むスクリプトは何ですか?
ただし、cygwin環境とperlは除外して。

603:login:Penguin
08/02/13 23:58:15 jHUDsaVW
>>602
javascriptに一票

604:login:Penguin
08/02/14 00:56:22 axFZQkw/
>>602
awk,ruby,Python つーかなんでperlダメなの?
たしかにWinのperlめんどいけどね。

605:login:Penguin
08/02/14 20:13:50 oi3zsBt5
ディレクトリにあるmp3ファイルを1行に3つずつ番号付きで表示して
指定されたファイルを再生するスクリプトを考えてみました。
これだとファイル表示の見た目がいまいちなんですが、カラムを揃えて
表示するようなうまいやり方はありますか?
i=1
for file in *.mp3
    do
        #3カラムで出力する
        x=`expr $i % 3`
        if [ $x -eq 0 ]
            then echo -e "\033[1;31m$i\033[0m.$file"
        else
            echo -en "\033[1;31m$i\033[0m.$file "
        fi
        a[i]=$file
        (( i=i+1 ))
    done
echo -n "number? >"
read n
if [ -f "${a[n]}" ]
    then mplayer "${a[n]}"
else
    echo "ファイルがありません"
fi

606:login:Penguin
08/02/14 21:53:57 gBoeKdqH
>>605

#!/bin/sh
FS=`zenity --file-selection`
#このままだと動画なんかもいけるけど、どうしても*.mp3のみにしたい場合は↑行を
#コメントアウトして↓行を有効にする
#FS=`ls *.mp3 | zenity --list --column "Files"`
if [ -z "${FS}" ]
then
 exit
fi
mplayer "$FS"

なんつってってねw

607:login:Penguin
08/02/14 22:01:12 vsXOhty3
zenityってなんだろーと思ってググったら……反則すぎ。


608:login:Penguin
08/02/14 22:52:41 fZu2vsjD
>>604
perl.exeの他に色々MS-Windows側に入れなきゃならないものがあるので可搬性に欠けるという理由を考えてみましたが、実は嫌いなだけです。

>>605
3列にこだわらないのなら、bashのselectはどうでしょう。
#!/bin/bash
select name in *.mp3
do
  echo "mplayer ${name}"
  #break
done

609:login:Penguin
08/02/15 02:46:55 4QUqq28I
>>605
printf で頑張るという選択肢もある。

610:605
08/02/15 19:02:00 BuE7cyMU
>>605の件ですが、レスしてくれた方々、ありがとうございます。
selectを使うのが簡単でイメージどおりなので、それでいきたいと思います。

611:login:Penguin
08/02/16 14:41:12 rUKDlild
久しぶりに来たけど相変わらず
キモいね


612:login:Penguin
08/02/16 14:52:30 TWToK0Vy
シェルに閉じこもってるスレですから

613:login:Penguin
08/02/16 15:09:40 hFdiJNir
ちょっとは環境変数も気にしろよ

614:login:Penguin
08/02/16 15:14:02 TWToK0Vy
export KIMOI=false

615:login:Penguin
08/02/16 15:25:59 hFdiJNir
$ export KIMOI=false
> if [ $KIMOI ]; then
> echo kimoi
> else kimokunai
> fi
kimoi

となります.助けてください><

616:login:Penguin
08/02/16 16:57:40 TCXFbGKj
釣られてやるが
if $KIMOI; then


617:login:Penguin
08/02/16 19:13:59 TWToK0Vy
いやいや、キモイとかキモクナイを超越することこそが答なのだよ。

 export KIMOI=

が正解なのだ。


618:login:Penguin
08/02/17 01:08:38 iw9ufgAV
>>615-616
なぜそうなるか素人の私にも解説してくだされぇ~

619:login:Penguin
08/02/17 01:11:52 slw092IT
>>616 素で知らなかった.ありがと!

620:login:Penguin
08/02/17 01:27:34 PyTcVmai
/usr/bin/[≒/usr/bin/test

621:login:Penguin
08/02/17 03:00:02 tnXxiXa8
>>618

if文やwhile文の条件部に書くのは、実はコマンド。
コマンドの終了コードが0なら条件が成立したとみなされる。
で、true(0を返す)やfalse(1(非0)を返す)というコマンドがあるわけだな。
ちなみに [ もコマンドだ。


622:login:Penguin
08/02/17 09:32:32 OGJD7PPY
みんな釣られ過ぎ…
$KIMOIに"false"という文字列を代入してるだけ。

623:login:Penguin
08/02/17 14:07:35 4A7UiB6D
>>612
俺らはゴーストですか

624:login:Penguin
08/02/17 14:21:15 slw092IT
>>623
ネットは広大だよな

625:login:Penguin
08/02/17 14:29:38 uY7SK9GA
>>623
否、貴腐人間かもw


626:login:Penguin
08/02/17 14:38:41 slw092IT
>>625
元ネタwkrn

627:login:Penguin
08/02/17 14:42:27 uY7SK9GA
>>626 「貴腐老人」でggrks


628:login:Penguin
08/02/17 14:44:26 slw092IT
>>627
tnks

629:login:Penguin
08/02/18 07:12:54 AGIm4SRV
zenity でファイルの選択をさせるのに、最初に任意のフォルダを開くにはなんと書けばいいのか教えて下さい。

630:login:Penguin
08/02/18 11:55:16 VgIMGwkB
カレントディレクトリを開くみたいだから、サブシェルを使ってこんな感じでどうかな
(cd /; zenity --file-selection)

631:login:Penguin
08/02/18 13:16:10 AGIm4SRV
>>630
ありがとうございます。
やってみます。

632:login:Penguin
08/02/19 08:50:21 90boQwVS
シェルスクリプトを覚えるとなにが出来るようになるんですか?

633:login:Penguin
08/02/19 09:00:32 7ADZuvq7
>>632
ルーチンワークで楽できる(場合がある)

634:login:Penguin
08/02/19 16:05:41 VrKwqWf/
>>632
作業の自動化や、例えばユーザを100人登録しないといけないとか言う、膨大な作業を
物凄い速度で短時間で終わらせる事が出来るようになるとか。

635:login:Penguin
08/02/19 17:25:49 90boQwVS
>>633>>634
ほほぅ、ありがとうございます。

636:login:Penguin
08/02/19 19:54:38 oWc/fsPo
ほほうって、コンピュータに仕事をさせるという観念のない人なんだろうか。
高級な紙と鉛筆だとしか思ってなさげな人。たまにいるけど……。

637:login:Penguin
08/02/19 19:56:54 7ADZuvq7
魔法の箱だと思ってるよりマシだと思う

638:login:Penguin
08/02/19 23:07:22 VrKwqWf/
コンピュータは ある機能を実現させる為の方法(アルゴリズム)を示してやれば
どんなにそれが重労働だろうが難しい計算をしないといけなかろうが、
忠実に高速かつ正確、大量に実行させる事が出来るから凄いよ・・・。

ただし、その仕事の仕方を教える(アルゴリズムを教える)のがかなり苦労するんだけどな・・・。

639:login:Penguin
08/02/20 03:07:58 eOYCs3Nz
基本的に人間がやってもできることを高速ですることしかできないということを知らない人が多すぎる

640:login:Penguin
08/02/20 03:37:12 Z0UaqwNw
それは、一秒間に3ギガ回も足し算したり、地球の裏側に光の速度で手紙を届けたりなんつーのは
基本的に人間には絶対できない、ということを知らない者は>>639だけだというだけの話かと。

641:login:Penguin
08/02/20 04:33:00 H+YlTABW
君も頭悪いな。
639は高速で、と書いてあるんだから、「速度を問わなければ」人間が…と
読むのが妥当という答にしかならないぞ。
どうせそういう突っ込みするなら空間計算量でやればよかったのに。

642:login:Penguin
08/02/20 07:24:32 kPfB9gdm
理論ばっかりのたまって生産性の無い人ってよくいるよね。

643:login:Penguin
08/02/20 08:22:42 TBsfl6zQ
まとめ。

Q) シェルスクリプトを覚えるとなにが出来るようになるんですか?
A) 理論ばっかりのたまって生産性の無い人ってよくいるよね。

644:login:Penguin
08/02/20 09:09:29 s2YtVBn2
>>632
シェルスクリプトでやりたいと思ったこと。

645:login:Penguin
08/02/20 10:22:00 0BB6Gw/L
俺は…彼女にパイズリして欲しいな…。
乳はAAだけど orz

646:login:Penguin
08/02/20 10:22:28 0BB6Gw/L
>>645
誤爆った。正直スマンかった。

647:login:Penguin
08/02/20 10:47:15 VHJ6cFjQ
>>645
基本的に彼女ができないことなのでシェルスクリプトでもできません。

648:login:Penguin
08/02/20 11:22:35 eOYCs3Nz
>>647
AAでもいいということなので,アスキーアートでおっぱいを表現することならシェルスクリプトで可能です
さらに最近のターミナルエミュレーターはアンチエイリアスがきいてるのでなめらかですよ

649:login:Penguin
08/02/20 11:31:04 Z0UaqwNw
すごいな。>>641は地球の裏側に手紙を届けたりなんてことが「ゆっくりならできる」そうだ。
できるというなら精々一生をかけて歩いて船をこいで手紙を届けにいって、それを証明してほしいものだ。
コンピュータという人間が使うモノが、人間以上の方法(アルゴリズムなどの知性)を知らないのは当然のことだが
最近ではその知性すら、コンピュータを使ったシミュレーション解析などで
得ることが増えているのが現実だったりするわけで。特に知の最先端ほどそうだ。
もはや人類はコンピュータを使わないと新しい知識を得ることすら「できない」状況なんだけどね。
そういう現実が見えない人はやっぱり自分の納得を唯一の判断基準とする文系人かな。
人間は遠くのものが見え、遠くの人と話し、より多くの知識を得、共有できるようになった。
100年前に比べたら、ほんとうに夢の魔法かコミックの世界だ。コンピュータはほんとに魔法の箱みたいじゃないか。
そのセンスは逆にあまり間違っていない気がするけどな。
「高度に進んだ科学技術はもはや魔法と見分けがつかない」アーサー・C・クラーク



650:login:Penguin
08/02/20 12:06:00 eOYCs3Nz
>>649
日本語でおk
電報というものがあるんだが最近のゆとりは知らないのか?

651:login:Penguin
08/02/20 12:14:29 pg37fRgc
ゆとり言いたいだけちゃうんかと

652:login:Penguin
08/02/20 12:23:41 XajlgLxx
ネタはよそでやっとくれよ。

653:login:Penguin
08/02/20 16:28:17 vrkF+BtG
このスレの>>640>>641の意見が興味深い。面白いな・・・。

>>648
そういうシェルスクリプト作って公開してよwwwwぜひ実行してみたい・・w

654:login:Penguin
08/02/20 19:29:13 7TuVNRao
先日の芥川賞受賞作が>>649の文章に似てる。
句点から次の句点まで地球半周ぐらいあって、だらだらと続く感じが。
URLリンク(sankei.jp.msn.com)

655:login:Penguin
08/02/21 06:19:36 FDbXS9I4
>>649
こういう無駄な長文を書ける才能には素直に感心するよ。

656:login:Penguin
08/02/21 12:33:09 xpu03eg4
時間を持て余してるんだろ?

657:login:Penguin
08/02/21 18:35:15 oj1Q2W6E
ある意味うらやましい知性だ。

658:login:Penguin
08/02/24 10:15:17 RUTtO6AQ
slコマンドってなかった?画面いっぱいにSLを表現
あれはシェルスクリプトではないから違うか・・・。

659:login:Penguin
08/02/24 11:38:47 kyu4Np6c
>>658
つ www.tkl.iis.u-tokyo.ac.jp/~toyoda/

660:login:Penguin
08/02/24 13:02:41 FjGZZj6V
bashです。

cdするたびに一緒にlsもして欲しいんですが、どうやって書いたらいいでしょうか?
aliasだとうまくできないです。


661:login:Penguin
08/02/24 13:04:14 UaS7yo8D
alias cls='cd $1 && ls'

662:login:Penguin
08/02/24 13:21:41 CzUoXlF2
clsといったらCLear Screenだろうに

663:login:Penguin
08/02/24 13:24:30 UaS7yo8D
そうなのか。うちにはそんなコマンドないって言われたもので。

664:login:Penguin
08/02/24 14:04:47 I77Y2jQo
そりゃDOSのコマンドだからな。

665:login:Penguin
08/02/24 14:44:06 FjGZZj6V
>>661
できないみたいです。

カレントディレクトリが切り替わりません。


666:login:Penguin
08/02/24 14:53:32 UaS7yo8D
>>665
うちでは動作確認したんだが・・・なんでだろね。

667:login:Penguin
08/02/24 14:54:08 UaS7yo8D
あ、ほんとだ、切り替わらないねw

668:login:Penguin
08/02/24 15:09:41 I77Y2jQo
PROMPT_COMMAND='if [ "$PWD" != "$PWD2" ]; then ls; PWD2="$PWD"; fi'

669:login:Penguin
08/02/24 15:13:49 uTpa9gVS
>>667
ぢゃあ関数にしちゃうとか。
function cls {
cd $1 && ls
}

670:login:Penguin
08/02/24 15:23:08 UaS7yo8D
cdはシェルの内部コマンドだから親プロセスには反映されないんだねえ。
#!/bin/sh
cd $1
ls
として、foo.shとして、
alias cds='. foo.sh'

かなあ。動作確認はしたw

671:login:Penguin
08/02/24 15:36:14 FjGZZj6V
できればclsじゃなくてcdでやりたいです。

>>669,670 でcdにするとなぜか動かない。
でも参考になりました。

>>668
わかんないです。

672:login:Penguin
08/02/24 15:41:52 FjGZZj6V
#!/bin/sh
'cd' $1
ls
として、foo.shとして、
alias cd='. foo.sh'

でできました。(・∀・)イイ!
ありがとう。

673:login:Penguin
08/02/24 15:42:06 Sa+MU/+b
cd() {
   builtin cd $1 && ls
}

674:login:Penguin
08/02/24 15:46:14 I77Y2jQo
( ゚д゚)……

675:login:Penguin
08/02/24 15:47:40 UaS7yo8D
>>673
ビルトインか。やっぱりman読まないとダメだな。
ありがとう。

676:login:Penguin
08/02/24 15:54:18 l3aT8ww/
ほう、すげっ


677:login:Penguin
08/02/24 15:55:21 FjGZZj6V
>>673
それも(・∀・)イイ!
トン

678:login:Penguin
08/02/24 16:08:01 OZdK2Ezs
668は逆にわかりやすいと思うが・・・なぜ分からぬ

679:login:Penguin
08/02/24 16:57:30 M1aIs9jI
>>659
slねぇ・・・Vine 3.2だとmakeしてもエラーが出てmake出来ないんだけど・・・?
apt-get install build-essential は入ってる環境です。

680:login:Penguin
08/02/24 21:43:32 X4+soAGj
>>679
libncurses.soのことか?

681:login:Penguin
08/02/24 22:41:47 WU8Eis2Q
>>673
cd に -P とかオプションつけると機能しなくなるぞ。

cd() { builtin cd "$@" && ls; }

682:login:Penguin
08/02/24 22:44:30 CzUoXlF2
>>673,>>681
それしばらく使ってみるとわかると思うけど、
そのままではナイーブすぎて少し不便だよ。

zshで同じようなことやってるけど、次の点は考慮した方がいいです。
・サブシェルで実行されたときにはlsしない
・行数が多すぎるときは適当な長さで切り、省略した旨を表示

683:login:Penguin
08/02/25 12:48:54 fTf5K0mT
同一内容のファイルを調べるシェルスクリプトなんだけど、過去にここかUNIX板の方で出てたっぽい。
結局やらず仕舞いだったようだし、どうせならシェルスクリプトの勉強がてらやってみようとおもった。

作りたい理想は以下のとおり
 ・コマンドラインでオプション指定を行い、検索ディレクトリとサブディレクトリへの再帰検索をするかどうか、あとファイルサイズ閾値を指定できる
 ・走査しているディレクトリにあるファイルパス&ファイルサイズのペアをリストとして吐く
 ・ファイルサイズ閾値未満で、ファイルサイズが一致したものに対してmd5sumを実行し、両方が同一のハッシュを吐いた場合、表示する。
 ・ファイルサイズ閾値を設定する理由はmd5sumが時間がかかりそうだから。閾値以上のサイズ一致ファイルはmd5sumすることなく表示する。



684:login:Penguin
08/02/25 12:52:01 fTf5K0mT
ちなみにサブディレクトリの再帰検索をせず、指定したディレクトリの全てのファイルのハッシュ値を比較して表示するだけなら

#!/bin/sh
md5sum $1/* | uniq -D --check-chars=32 | sed 's/^[0-9a-f]* \*//g'

上のだけで済むかな。標準エラーがうざいけど・・・
まずはディレクトリの再帰検索について質問したいところです。

685:login:Penguin
08/02/25 12:55:37 fTf5K0mT
あ、uniqの間にsortを入れてあげるとより親切か
うちの場合はwgetで自動保存したファイルの整理だから、ファイル名が必然的に「DLファイル名+.連番」だから気にならないけど
まったく違うファイル名かつ内容は同一ってときに、ハッシュ値でsortしてあげていた方がいいよね
そう考えたらsedでハッシュ値をわざわざ消す必要もないか・・・

md5sum $1/* | sort | uniq -D --check-chars=32

686:login:Penguin
08/02/25 12:57:54 fTf5K0mT
再帰検索はこの場合、find $1でファイルリストを列挙してからreadで"ls->ファイルサイズ取得"やら"md5sum"やらした方がいいのかな?

687:login:Penguin
08/02/25 13:38:12 fTf5K0mT
不恰好だけどサブディレクトリまで調べて、全てのファイルにmd5sumして表示するのはこんな具合か・・・

#!/bin/sh
TMPFILE="filelist"
touch $TMPFILE
find $1 | while read FILENAME; do
if [ -f "$FILENAME" ]; then
md5sum "$FILENAME" >> $TMPFILE
fi
done
sort < $TMPFILE | uniq -D --check-chars=32
rm $TMPFILE

もうちょっとスマートにならないかなあ・・・ あとユニークなサイズのファイルはmd5sumさせたくないなあ

688:login:Penguin
08/02/25 13:47:58 pu40lUxS
書いてみた。

#!/bin/sh
# finddup.sh -- find . | finddup.sh
while read -r FILENAME
do
    [ -f "$FILENAME" ] &&
        printf "%14d:%s\n" `stat -c %s "$FILENAME"` "$FILENAME"
done | sort | uniq -D -w14 | cut -b 16- |
xargs md5sum | sort | uniq -D -w32

689:login:Penguin
08/02/25 13:53:38 pu40lUxS
uniq -f のほうが良さそうだね

690:login:Penguin
08/02/25 13:57:12 ATO0A7OZ
>>687
find . -type f -print0 | xargs -0 md5sum | sort | uniq -D -w32

691:login:Penguin
08/02/25 14:17:36 fTf5K0mT
>>688
ありがとう!
あ、ただファイルやディレクトリ名にスペースが入るとmd5sumにしっかり渡せないみたいです
bash on cygwin環境だとWindowsの「コピー (2) ~ hoge.txt」という名前が恨めしい

>>690
出力結果同じだΣすげえ
ちょっとman読んでこよう・・・

692:login:Penguin
08/02/25 14:23:38 pu40lUxS
xargs --delimiter "
" md5sum
でどうかな。ちゃんとテストしなきゃだめだね
まあ改行文字を含むファイルがあるとだめなんだけど、面倒だから他の言語でやらせたほうがいい

693:login:Penguin
08/02/25 14:26:43 ATO0A7OZ
>>692
>>690

694:login:Penguin
08/02/25 14:27:32 pu40lUxS
>>693
全部のファイルにmd5sumかけたら遅いだろ

695:login:Penguin
08/02/25 14:31:42 fTf5K0mT
あ、>>688のxargs md5sumを>>690のようにxargs -0 md5sumにすればOKなのかな

696:login:Penguin
08/02/25 14:38:34 ATO0A7OZ
>>695
んで、printf 側でも \n じゃなく \0 を使うようにする。

697:login:Penguin
08/02/25 14:39:51 pu40lUxS
uniqとcutはどうするよ

698:login:Penguin
08/02/25 14:43:11 fTf5K0mT
printfで囲ってやればイケました(`・ω・´)

#!/bin/sh
# finddup.sh -- ./finddup.sh target-path
find $1 | while read -r FILENAME
do
[ -f "$FILENAME" ] &&
printf "%14d:\"%s\"\n" `stat -c %s "$FILENAME"` "$FILENAME"
done | sort | uniq -D -w14 | cut -b 16- | xargs md5sum | sort | uniq -D -w32

699:login:Penguin
08/02/25 15:21:01 zYqxhFYE
久々にまともな流れだな

700:login:Penguin
08/02/25 16:57:52 fTf5K0mT
ついでに以下のような動きが出来ないか色々試してみています。
どうも二進も三進も行かない

$ ./findup.sh ~/pic/jun.2chan.net/

2件の一致ファイル:8f7c1e2adb45adbfdb4d86adb1b9e894--------------------------
~/jun.2chan.net/b/src/1192805081129.jpg
~/jun.2chan.net/b/src/1192805081141.jpg
-------------------------------------------------------------------------------
~/jun.2chan.net/b/src/1192805081129.jpgを削除しますか?[y/N/a]
~/jun.2chan.net/b/src/1192805081141.jpgを削除しますか?[y/N/a] y
~/jun.2chan.net/b/src/1192805081141.jpgを削除しました。

3件の一致ファイル:6fc4bdc4bc3bb06882bc98d9cbeb60c3--------------------------
~/jun.2chan.net/b/src/1192800164913.jpg
~/jun.2chan.net/b/src/1194189136460.jpg
~/jun.2chan.net/b/src/1194189137115.jpg
-------------------------------------------------------------------------------
~/jun.2chan.net/b/src/1192800164913.jpgを削除しますか?[y/N/a] y
~/jun.2chan.net/b/src/1192800164913.jpgを削除しました。
~/jun.2chan.net/b/src/1194189136460.jpgを削除しますか?[y/N/a] y
~/jun.2chan.net/b/src/1194189136460.jpgを削除しました。

↑同一として列挙されたパスの残りが1になると削除せず次へ

701:login:Penguin
08/02/25 17:00:46 ATO0A7OZ
>>700
そこまで行くとシェルスクリプトには荷が重いんじゃないか?

702:login:Penguin
08/02/25 17:10:48 fTf5K0mT
>>701
以下の点でハードルがあがってるみたいですね

・一致したファイルのグループ分け
・ファイルを一つだけ残して削除した場合、残りの1ファイルは削除しない

列挙した全ファイルに対して、質問→削除というのは簡単にいけそうな感じ。
自分の知識だけで無理と判断して投げるのはアレだと思ったんだけど、やっぱ難しいかなあ

703:login:Penguin
08/02/25 18:09:02 pu40lUxS
#!/bin/bash
# askdelete.sh -- find . | finddup.sh | askdelete.sh
# よくテストされてませんので注意
TMPF=`mktemp /tmp/askdelete.XXXXXX`
trap 'rm $TMPF' 0
CURHASH=
COUNT=0
(cat; echo DUMMYHASH /dev/null) |
while read -r HASH FILENAME; do
    if [ "$CURHASH" ] && [ "$CURHASH" != "$HASH" ]; then
        echo "------------------------------"
        echo "$COUNT 件の一致ファイル:$CURHASH"
        tail -n $COUNT $TMPF | cut -b 33-
        echo "------------------------------"
        tail -n $COUNT $TMPF | while read -r HASH FILENAME; do
            [ $COUNT -eq 1 ] && break
            echo -n "$FILENAME を削除しますか? [yN] "
            while read ANSWER
            do
                case "$ANSWER" in
                [yY]) echo rm "$FILENAME"
                      COUNT=`expr $COUNT - 1` ;;
                esac
            done < <(head -1 /dev/tty)
        done
        COUNT=0
    fi
    echo $HASH $FILENAME >>$TMPF
    CURHASH=$HASH
    COUNT=`expr $COUNT + 1`
done

704:login:Penguin
08/02/25 18:12:29 pu40lUxS
done < <(head -1 /dev/tty) とか、絶対おかしいよこれ。
違う言語で書き直したほうがいい。

705:login:Penguin
08/02/25 18:17:46 fTf5K0mT
おおすげええΣ
ちょっとテストしてみます!

706:login:Penguin
08/02/25 19:20:15 pu40lUxS
#!/bin/sh
# askdelete.sh -- find . | finddup.sh | askdelete.sh
TMPF=`mktemp /tmp/askdelete.XXXXXX`
trap 'rm -f $TMPF' 0 1 2 3 15
CURHASH=
COUNT=0
(cat; echo DUMMYHASH /dev/null) |
while read -r HASH FILENAME; do
    if [ "$CURHASH" ] && [ "$CURHASH" != "$HASH" ]; then
        echo "------------------------------"
        echo "$COUNT 件の一致ファイル:$CURHASH"
        tail -n $COUNT $TMPF
        echo "------------------------------"
        tail -n $COUNT $TMPF | while read -r FILENAME; do
            [ $COUNT -eq 1 ] && break
            echo -n "$FILENAME を削除しますか? [yN] "
            while read ANSWER; do
                case "$ANSWER" in
                [yY]) echo rm "$FILENAME"
                      COUNT=`expr $COUNT - 1` ;;
                esac
                break
            done < /dev/tty
        done
        COUNT=0
    fi
    echo $FILENAME >>$TMPF
    CURHASH=$HASH
    COUNT=`expr $COUNT + 1`
done
すこしよくなった
参考になる URLリンク(www.nurs.or.jp)

707:login:Penguin
08/02/25 20:58:36 NDOa2UbC
理想的な流れだ。


708:login:Penguin
08/02/26 01:26:57 Knz7qJ2h
>>706
サブシェルをわざわざ使う必要は無いのでは?

--- (cat; echo DUMMYHASH /dev/null) |
+++ { cat; echo DUMMYHASH /dev/null; } |

709:login:Penguin
08/02/26 01:31:17 V2S90oTo
こんなのじゃ駄目?

find . -type f -print | xargs md5sum | sort | while read i
do
 set -- $i
 test -e .$1 && rm -i $2
 touch .$1
done

削除して残りが1つなら消さずに次、ということは最初の1つは
無条件で残して、2つ目以降についてのみ rm -i で削除確認すれば
いいんだよね?

記憶用に .<md5sum> なマーカ作ってるけど、ここは md5sum な
ダミー環境変数の方がいいかも。

710:login:Penguin
08/02/26 08:30:35 V4Ca66lJ
>>709
全ファイルにmd5sumしたら遅くならない?

711:login:Penguin
08/02/26 08:46:21 M2OUW+0j
>>708
パイプを使うと結局はサブシェルが起動されるんだから () のほうがわかりやすいと思うよ

712:login:Penguin
08/02/26 09:53:07 jk2VB7eG
>>710
どうせシェルスクリプトなんて使い捨てなんだし
多少遅くてもいいんじゃない?
実行時間の長さより
思いついたことをちゃちゃっと実行できる手軽さが大事でしょ。

713:login:Penguin
08/02/26 10:56:04 V4Ca66lJ
>>712
もっともな意見だと思うが、肝心なことを棚に上げてるな
シェルスクリプトの本質は処理を効率化するための機能なんだから、
手軽に加えて「より早くスマートに処理」できる方がいいだろうよ

どうせ使い捨てとか言い出したら、いつまで経っても遅くて低機能なスクリプトしか書けないぜ?
まあせっかくいい方向で流れてるから、俺も最適化してみるか。

714:login:Penguin
08/02/26 15:09:02 KrvpwwSS
手作業で30分かかる作業を、わずかワンライン5秒で済ます。
どうよ、この快感、すごいよ、俺!!
ただしスクリブト書きに3時間かかるけどなっ!!、
みたいな・・・・


715:login:Penguin
08/02/26 15:18:25 jk2VB7eG
5分で書いて実行時間3分にできればそれでおkだよな。
その作業を200回繰り返さなきゃいけないなら
3時間かけて書いて5秒に短縮してもいいけど、
そういうのはシェルじゃなくて別な言語を使った方がいいと思う。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch