[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/25 03:18 / Filesize : 212 KB / Number-of Response : 865
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:シェルスクリプトライター mailto:sage [2011/12/10(土) 20:06:40.38 ]
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。

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

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

前スレ
シェルスクリプト総合 その18
hibari.2ch.net/test/read.cgi/unix/1308195527/

次スレは >>970 で。

404 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/27(月) 23:36:20.13 ]
>>403
おおー入った! \(@o@)/

どういう仕様になってるんだろう
サブシェル的な問題?

405 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/28(火) 08:06:57.00 ]
>>404
その通りだが、そうならないシェルもある。自分なら read hoge hage <<<"hoge hage" って書く

406 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/28(火) 10:45:26.99 ]
ヒアストリングってbash/zsh以外でも使えんの?

407 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/28(火) 11:12:25.51 ]
古典ヒアストリングならな。

408 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/28(火) 18:54:44.50 ]
ソラリスのkshは冷やすとリング使えないのに、
リナックスのkshは冷やすとリング使える不思議

409 名前:400 mailto:sage [2012/02/28(火) 22:39:16.48 ]
ヒアストリングってスレの初めの方で出てたやつですか
オイラの読んだ入門書には載ってなかったんだよなぁ

と思いながら試してみたら
Syntax error: redirection unexpected
sh -> dash なうちのDebianじゃダメみたい (・ω・` )
ステキな機能だけに残念

やっぱこういう場合はset使うべきなんですかね…

410 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/28(火) 22:52:20.02 ]
>>403じゃまずいの?

一行で書きたいならセミコロン
echo hoge hage | { read hoge hage; echo hoge=$hoge hage=$hage; }

411 名前:名無しさん@お腹いっぱい。 [2012/02/29(水) 02:06:19.12 ]
getoptsにて「-yx」のように複数文字のオプションを判定することは可能なのでしょうか?

xxx.sh -a test -yx

#!/bin/ksh
while getopts a:yx opt
do
case ${opt} in
a)
YY=${OPTARG}
echo "オプション[-a]の引数は${YY}だよ。"
;;
yx)
echo "オプション[-yx]があるよ。"
;;
esac
done


412 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/29(水) 08:15:39.53 ]
>>411
getoptsでは、-yx は -y -x と指定したのと同じに解釈されるから無理。



413 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/29(水) 10:48:10.11 ]
代わりに --xy を使うとよろし。

414 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/29(水) 10:50:38.33 ]
>>413
すみませんが詳しい方のみ回答をお願いします

415 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/29(水) 10:54:40.48 ]
ああ --yx か。とにかく>>412のいう通りってこった。

416 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/29(水) 11:34:25.80 ]
getopts y: として $OPTARG が x かどうか判定すればいいんじゃね?
-y x も受けつけちゃうけど。


417 名前:名無しさん@お腹いっぱい。 [2012/02/29(水) 14:08:24.59 ]
どうもこんにちは〜
list=`cat ./file | grep aaa`
って感じでlistにaaaを持つ行を全部放り込んでるのですが、
これらを別々の1行ずつに分割して
なおかつlistを配列にして格納する事はできますか。

具体的には、fileの中にはaaaの文字列を持つ行が5つあるのですが
それをlist[0]〜list[4]に格納したいのです。

よろしくご指導お願いしますm(_ _)m

418 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/29(水) 14:10:31.36 ]
なんで cat 通すんだろ。
grep aaa file でよくね?

419 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/02/29(水) 15:35:13.71 ]
>>417
IFSに改行コードのみを代入した状態で、list配列に一括代入する文法を使う。

#!/bin/bash
IFS='
'

list=(`grep aaa file`)

420 名前:名無しさん@お腹いっぱい。 [2012/02/29(水) 16:42:01.73 ]
>>419
ありがとうございます!
できました!

421 名前:400 mailto:sage [2012/02/29(水) 23:33:48.87 ]
ロングオプションは getopt でいけるけど何か問題もあったんだっけ

>>410
パイプ通すとブレースもサブシェルで動作してるのか
外からは参照できないみたいなんですよね
いやもちろん最初の例もサブシェル作ってるんですが (;´Д`)
処理の内容にもよるけど、やっぱりグローバルで使いたいってなると
関数に括り出してバッククォートで呼んだりして結局同じようなことなのかなぁと
そんな感じの意味です

でも勉強になりましたみなさんありがとう

422 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/01(木) 06:47:03.28 ]
>>421
getopt(外部コマンド)はスペース入りファイル名などの引数を正常に扱えない
などの仕様バグの固まり。getoptsを使うべし。



423 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/05(月) 08:04:37.31 ]
とあるソースから
#define      HOGE      MAGE
HOGE の定義値を抽出したい。

grep HOGE header.h |grep define |awk print $NF
みたいな書き方(うろ覚え)すると
キャリッジリターンも拾うわ、
タブ(スペース)数でフィールド変わるわなんですが
うまい方法ないですか?

424 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/05(月) 08:12:54.29 ]
>>423
$ cat header.h
#define HOGE MAGE

$ (cat header.h; echo HOGE) | gcc -E -P -

MAGE

425 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/05(月) 08:25:52.14 ]
プリプロセッサに置き換えられるからプリプロセッサに置き換えさせるとかワロタw

426 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/05(月) 09:38:08.86 ]
でもうまい方法でしょ?

427 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/05(月) 10:17:08.26 ]
#ifとか考え出したらそれ一択。

428 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/05(月) 12:00:16.07 ]
複数行に渡るマクロもあるしな。
けどお題はもっと単純な話なんじゃないのかな。

マクロの展開を止めたいなら、
(#define MAGE 〜があってもMAGEを出力したい場合)
awkスクリプトになってしまったが、こんな感じ。
awk '$0 ~ /^#define[ ]+HOGE/ { $1=""; $2=""; print $0 }'
[]の中はスペースとタブ

429 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/05(月) 22:50:17.04 ]
質問です。
あるディレクトリにある全部のファイルに対して
コンパイルをかけるスクリプトをつくりたいです。
TESTLISTには
ソース名 コンパイラオプション
が書いてあります(hoge.c 5みたいに)
---------------------------------------------
#!/bin/sh
# プログラム、コンパイルオプション一覧リストを指定
LIST=/home/shell/TESTLIST
# コンパイラのパスを設定
CCOM=/home/shell/cc.sh
# コンパイルをかける
while read ARG1 ARG2
do
${CCOM} ${ARG1} ${ARG2}
done < ${LIST}
--------------------------------------------
のような簡単な奴で良いんですが、

430 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/05(月) 22:51:02.05 ]
続き
cc.shの中に、
--------------------------------------------
if [ ${RETCD} -ne 0 ]
then
echo "コンパイルログを表示しますか?"
RCV=""
while [ `echo "${RCV}" | sed -ne '/^[ ]*[yYNn][ ]*$/p' | wc -l` -eq 0 ]
do
read RCV
done
if [ `echo "${RCV}" | sed -ne '/^[ ]*[yY][ ]*$/p' | wc -l` -ne 0 ]
then
more ${コンパイルログ}
fi
fi
-------------------------------------------
のように書いてあり、コンパイルに失敗した場合、
「コンパイルログを表示しますか?」が端末に表示されたままで、「N」や「Y」を
入力しても反応がなく、Ctr-Cで実行を打ち切っている状態です。


431 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/05(月) 22:52:03.41 ]
続き
コンパイルに失敗した場合、Ctr-Cを入力すると
次のファイルにコンパイルをかけるようにしたいのですが、
--------------------------------------------
#!/bin/sh
# プログラム、コンパイルオプション一覧リストを指定
LIST=/home/shell/TESTLIST
# コンパイラのパスを設定
CCOM=/home/shell/cc.sh
# Ctr-Cを無視するように設定(サブシェルには有効)
trap : 2
# コンパイルをかける
while read ARG1 ARG2
do
#サブシェル化
(${CCOM} ${ARG1} ${ARG2})
done < ${LIST}
---------------------------------------------
でオッケーでしょうか?
ちなみにMakeは使用不可です。また、cc.shはいじれません。


432 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/06(火) 11:06:00.37 ]
>ちなみにMakeは使用不可です。また、cc.shはいじれません。

この状況を何とかした方が建設的かと。




433 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/06(火) 19:10:20.96 ]
>>431
> でオッケーでしょうか?
つまり俺たちにデバッグしろと言っているのか?

434 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/06(火) 19:12:06.02 ]
はい

435 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/06(火) 19:19:26.97 ]
はいじゃないだろうが!

436 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/06(火) 19:21:31.59 ]
はいじゃないが

437 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/06(火) 20:23:39.44 ]
はいはい。

438 名前:名無しさん@お腹いっぱい。 [2012/03/06(火) 21:07:07.27 ]
>>429
コンパイルに失敗した場合、「N」や「Y」を入力しても反応がない原因を
教えてやる。

>>429 の while do .. done ループで、done < ${LIST} となってるので、
標準入力が ${LIST} にリダイレクトされたままになってて、
その状態で cc.sh が起動されてる。
cc.shの中でキーボードを読んでるつもりが、${LIST}を読んでしまうので、
「N」や「Y」を入力しても反応しない。

解決方法は、>>429 で、

----------------------------
exec 3< ${LIST}
while read ARG1 ARG2
do
${CCOM} ${ARG1} ${ARG2}
done 0<&3
----------------------------

とすること。標準入力をキーボードにしたまま、readには記述子3を読ませる。

439 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/06(火) 21:12:06.05 ]
>>438
おいおい、そのリダイレクト方法だと結局同じ理由で駄目だよ。

標準入力を退避しておいて復帰する。

exec 3<&0
while read ARG1 ARG2
do
${CCOM} ${ARG1} ${ARG2} 0<&3
done < ${LIST}

440 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/06(火) 21:17:04.64 ]
>>439 の方法でもいいが、
>>438 が言いたかったのは
↓じゃないかな

exec 3< ${LIST}
while read ARG1 ARG2 0<&3
do
${CCOM} ${ARG1} ${ARG2}
done

441 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/06(火) 22:15:57.04 ]
>431
> でオッケーでしょうか?
オッケーだと言う人がいたらしいよ。

ただし私は、貴方の環境と責任を共有していないので、自己責任でやって下さいね。

442 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/07(水) 00:36:49.85 ]
テキストから読み込んだ文字列内の「\\」をそのまま変数に入れたり表示させたりする方法を
探しています。OSはCentOS6、シェルはbashです
以下のような問題に対処したいのですが、何か手段はありますでしょうか?

以下のsampletext.txt(「\\」や「\」を含む)を、readecho.shのようにreadで読み、
echoで出力すると、「\」がエスケープか何かされているようで、表示されません
bashやechoのmanにある-Eオプションを明示的に付与してみても変化が無いようです

awkprint.shのようにawkで行うと期待した結果が出るのですが、他の処理の関係上、
できればawkは使わずに、シェルスクリプトで実現させる方法を知りたく思ってます
テキストを事前に「\\」から「\\\\」としておく等の対処はせずに済ませたいです

$ cat sampletext.txt
\\winsv\a\b\c
\\sambasv\d\e\f

$ cat readecho.sh
#! /bin/sh
while read STRING
do
echo -E "${STRING}"
done < sampletext.txt
$ ./readecho.sh
\winsvabc
\sambasvdef ←「\\」が「\」になり、「\」が消えている。NG

$ cat awkprint.sh
#! /bin/sh
cat sampletext.txt | awk '{print $0}'
$ ./awkprint.sh
\\winsv\a\b\c
\\sambasv\d\e\f ←上記のような問題はない。OK



443 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/07(水) 00:42:21.68 ]
>>442
read -r

444 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/07(水) 00:42:48.66 ]
つread -r

445 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/07(水) 00:45:02.83 ]
普通はread -rだけどbashは知らん。

446 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/07(水) 00:48:20.73 ]
>>443-445
情報ありがとうございました
うまくいきました
bashでもreadは「Backslash does not act as an escape character.」だそうです
なるほどreadで対処するのか...

$ cat readecho.sh
#! /bin/sh
while read -r STRING
do
echo -E ${STRING}
done < sampletext.txt

$ ./readecho.sh
\\winsv\a\b\c
\\sambasv\d\e\f

447 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/07(水) 00:55:51.24 ]
>>446
> bashでもread -rは「Backslash does not act as an escape character.」だそうです

と書きたかったのか?


448 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/09(金) 22:27:14.08 ]
AとBの処理があって、

Aを開始、
Bを開始
Bの中でAの処理中を待つことできますか?
意味わかりませんかね・・・
mkdirとかロック待ちみたいなやつです。




449 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/09(金) 22:43:33.00 ]
ロック待ちがわかるんなら、そのまんま A で mkdir lock して B で [ -d lock ] かければ?
while 文で無限ループ作って、sleep でも挟めば十分「処理待ち」になると思うけど。


450 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/09(金) 22:44:29.80 ]
>>448
FreeBSDなら lockf(1)、Linuxならflock(1)を使ってなんとかしろ。

451 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/09(金) 23:06:08.54 ]
>>449-450
ありがとうございます。
がんばってみます。


452 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/09(金) 23:18:55.14 ]
>>450
なんで似てるようで違う名前なの?



453 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/10(土) 00:14:30.88 ]
カレーライスとライスカレーみたいなモン

454 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/10(土) 09:50:04.49 ]
うまいなあ。それイタダキマス。

455 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 03:13:24.48 ]
a=0
for FILE in `find / \( -iname "zoo*.png" -o -iname "land*.png" -o -iname "zoo*.txt -o -iname "land*.txt" \)`; do
rm -vf $FILE
echo $a
done
初心者です、スクリプト書いてみたんですが、この$aで表示される数がおかしくてこまってます。
なぜかrmコマンドでは1つも削除されておらずメッセージも表示されていないのに4と表示されるのです。
やりたい事としてはこうです↓

「zoo*.png、land*.png、zoo*.txt、land*.txtというファイル名のファイルを全て削除し、その数をカウントする」

何がおかしいのでしょうか?

456 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 04:32:12.07 ]
>>455
4が表示されるのはオカルト。君もうすぐ死ぬんじゃない?
ファイルを削除して数をカウントしたいだけなら

find ほにゃらら -print0 | xargs -0 rm -v | wc -l

でよい。変数もforも必要ない。
4が出るのは君がオリジナルのスクリプトをここにコピペするときに何か端折ったせいだろう。

457 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 04:53:51.30 ]
>>456
ごめんなさい、a=$(($a + 1))が抜けてました...

にしてもこんなにコンパクトになるもんなんですね
ありがとうございました

458 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 08:05:01.28 ]
xargsは原始人の道具。
find ほにゃらら -exec rm -v {} + | wc -l
で良い。

459 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 08:11:05.46 ]
-deleteが使えるfindもある
find ほにゃらら -delete -print | wc -l

460 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 08:14:18.54 ]
>>458
-exec の方が古い感覚だけどどうなんだろ?

461 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 08:17:25.43 ]
>>460
-exec ';' なら古い感覚
-exec + は新しい感覚

462 名前:460 mailto:sage [2012/03/11(日) 08:29:08.31 ]
>>460
+ はいま使っているマシンの中では使えない物がほとんどかも。

-exec は元々 Unix に魅せられたポイントなので、1989 年には使ってた。
xargs はネットで教えてもらって 1995 年頃から使い始めた。
けど確か元からあったかも。



463 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 08:32:05.19 ]
>>462
-exec + はSolarisでさえ使えるのに、どんな古いOS使ってるんだよ?

464 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 08:54:41.56 ]
POSIXにも入っていてSVR4由来(当然Solarisにもある)でHP-UXにもあるのに、
使えないのを探す方が難しいよね。
原始人と言われたからってムキになってウソを教えるのは良くないな。

www.pasc.org/interps/unofficial/db/p1003.2/pasc-1003.2-210.html
| One of these extensions, which I believe is supported at least on all
| systems derived from SVR4 and on HP-UX (although in some cases it is an
| undocumented feature), is a variant of the "find -exec" primary where
| "find" does argument aggregation internally:
|
| find . -type f -exec some_command {} +

465 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 09:52:56.43 ]
ちょっと前までテンプレにfindの項があったと思うが、今は無くなってるな。
確かテンプレではfind -print0 | xargs -0推奨で、スレ内議論では-exec +を使えと主張する人がいた。

466 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:09:06.10 ]
テンプレにあったのはfind -print | xargs という回答には必ず言いがかりが付け
られていたから。質問者のためではなく回答者のためのテンプレ。
-exec {} + 構文が紹介されてからはxargsを使う意味がなくなったのか削除された。

それでもしばらくは-exec {} + を知らない原始人がいたけど、そのたびに原始人と
呼ばれて、絶滅していった。テンプレから削除されたのはこの時点(絶滅後)かも。

-exec {} + ですべてが置き換え可能とは言わないが、find+xargsが必要になること
は極めてまれ。

467 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:32:32.19 ]
うーむ、結局その2つ違いって何ですか?

あと、パイプで繋がってしまっているrmを画面にも出力する方法ってないんでしょうか?

468 名前:460 mailto:sage [2012/03/11(日) 10:44:50.32 ]
俺が xargs 教えてもらった頃は
-exec は fork するから良くないと言われてた。

+ は SVR4 に入っているのなら俺のもだいたい動くね。
でも俺まだ Tower の SVR2 や SVR3 とも格闘してるから。
ファイル名の長さが 14 文字までのやつ。

469 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:44:55.57 ]
>>467
2つの違い
-print0や xargs -0は使えないOSがある。

>パイプで繋がってしまっているrmを画面にも
tee

470 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:55:09.82 ]
>>467
1 find -exec \; 構文ではファイル一つ毎に別プロセスが起動されるので効率が悪い。
2 そこでまとめて処理できるようxargsが作られた。初出はPWBだからかなり古い
find -print | xargs
3 ファイル名に改行入れられるとヤバいので-print0, -0が設けられた
 find -print0 |xargs -0
4 そんな面倒な事しなくて済むように-exec {} + 構文が作られた
 -exec \; 構文と違い、別プロセスは(MAX_ARGSを考慮して)まとめて実行される。

> あと、パイプで繋がってしまっているrmを画面にも出力する方法ってないんでしょうか?
find ほにゃらら -delete -print |tee /dev/tty| wc -l
find ほにゃらら -exec rm -v {} + |tee /dev/tty| wc -l

471 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:56:05.20 ]
> -print0や xargs -0は使えないOSがある。

例えば?

どっちも相当昔からある気がするけど

472 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 10:58:21.95 ]
>>471
ちょっとは自分で調べろよ。Solarisで-print0等が使えないのは常識。



473 名前:460 mailto:sage [2012/03/11(日) 11:04:39.92 ]
>>470
+ 便利そうだな。

474 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:06:35.90 ]
-0はFreeBSD 2.1.5-RELEASEにはない。FreeBSD 2.1.6.1-RELEASEにはある。
相当昔といえば言えなくはないが。

www.freebsd.org/cgi/man.cgi?query=xargs&apropos=0&sektion=0&manpath=FreeBSD+2.1.5-RELEASE&arch=default&format=html

www.freebsd.org/cgi/man.cgi?query=xargs&apropos=0&sektion=0&manpath=FreeBSD+2.1.6.1-RELEASE&arch=default&format=html

475 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:22:05.20 ]
結局、自分が使ってるOSで使える方法を使えって結論になってるよね毎回

476 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:29:54.60 ]
答える側は質問者の環境を想像すべきだな。
SVR[23]のような骨董環境前提の回答なんか意味ない。

477 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:38:38.97 ]
それなら結局xargsでも-exec +でもどっちでも良いんじゃない?十分に新しいLinux/*BSD環境前提なら。
自分はタイプ数の多いxargsは使わないけどね。
無用な-exec \;と-0無しのxargsさえ避ければ良い。
そもそも今回は-deleteが使えるならxargsも-exec +も要らないし。

478 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:42:53.84 ]
>>477
だから、使える方法を使えばいいってことでしょ?
結論見えてないの?

479 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 11:51:09.25 ]
>>469>>470
できました!!ありがとうございましたm(_ _)m

480 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 15:05:46.64 ]
>>470
> 3 ファイル名に改行入れられるとヤバいので-print0, -0が設けられた

改行というか、広い意味での空白($IFS)だな。

481 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 15:27:32.53 ]
xargsは、$IFSの改行/スペース/TABだけじゃなく、
シングルクォート/ダブルクォートも解釈しちゃうという問題がある。

it_don't_mean_a_thing.mp3

とかのファイル名もそのまま通らない

482 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 20:30:34.37 ]
こういうイヤーンなファイル名があるときって、makeが通らなくなって難儀する。
コロン(:)が含まれてるファイル名なんか最悪。。
FILES = $(wildcard *.mp3)

$ make hoge
Makefile:〓: *** multiple target patterns. Stop.



483 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 22:43:26.33 ]
なんかもう素人の集団みたいになってるな

基本的な歴史としては>>470の通りなんだが
現代においてはfindで引っかるファイル数が数十万〜数百万ということも珍しくなくなった
そしてそのような場合{} +では処理できない、というか渡された先が悲鳴を上げる
だから 5. としてxargsを-n付きで使うようになったわけ
>>481みたいな問題にもちゃんと解法はある、つーかググレカス

ゆえに{} +はファイルを渡す先が確実に処理できると確信できる場合だけ使うべきで
癖をつけるなら-print0 | xargs -0の流れが正しい
何か問題が起きてもxrgsにオプション足すだけで解決する

つーか、初期の頃はちゃんとそう説明する奴が居たはずだけどな…

484 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 23:15:55.26 ]
>>483
> 現代においてはfindで引っかるファイル数が数十万〜数百万ということも珍しくなくなった
> そしてそのような場合{} +では処理できない、というか渡された先が悲鳴を上げる

<limit.h>に従った正しいプログラムなら何の問題もないです。

> だから 5. としてxargsを-n付きで使うようになったわけ

これはあほなプログラム向けです。


485 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 23:18:50.93 ]
不特定個数の引数をとれるという仕様にもかかわらず悲鳴あげるのはバグ。
引数の個数に制限がある場合にはxargs -nも有効だが、そんなヘナチョコ
コマンド出会ったことない、具体的には何?

486 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 23:24:03.91 ]
>>483
その根拠は何?
pubs.opengroup.org/onlinepubs/009604599/utilities/find.html
> The size of any set of two or more pathnames shall be limited
> such that execution of the utility does not cause the system's {ARG_MAX}
> limit to be exceeded.

>>484
あほなプログラムの実例
savannah.gnu.org/bugs/?func=detailitem&item_id=16738

487 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/11(日) 23:37:58.77 ]
というわけで2006年以前のfindutilsを使う可能性がある人は、
バグがあるので -exec {} + はやめたほうがいいということになるのかな

488 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 07:42:10.36 ]
>>483は渡された先が悲鳴あげるといっているので、それは違う。
もっとも、>>483がその区別をつけられないだけかも知れないが。

489 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 17:53:31.98 ]
結局>>483はボケ老人のタワゴトって結論でいいですか?
・悲鳴あげるヘナチョココマンドの存在は不明
>>481のようなケースも-print0, -0で対処できるている。

490 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 18:00:08.91 ]
>>489
>>481 はそういうことを言ってるんじゃない。
>>480 が $IFSだけが問題と言っているのでは誤解を生じるので、
それだけじゃなくクォートも、と言う話。

491 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 18:05:46.84 ]
>>490
ボケ老人のタワゴトとは>>483の↓この発言。>>481の指摘は正しい。
> >>481みたいな問題にもちゃんと解法はある、つーかググレカス

492 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 18:22:03.41 ]
まあxargs対策でエスケープすればいいんだから、findの出力をfilterするなり解法はあるわな。

> 何か問題が起きてもxrgsにオプション足すだけで解決する

こっちのほうが問題では。



493 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 18:28:41.55 ]
GNU findutilsは、デリミタを指定すると(-d, -0)、quoteは無視するようになっている。
他のfindは使ってないので知らないが。

494 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 18:29:11.30 ]
print0でNUL文字を区切りにしたんだから、ファイルシステムに
許されているいかなる文字もこれで対応でしょ。

> 何か問題が起きてもxrgsにオプション足すだけで解決する
その問題とは? >>483のボケた脳内にある悲鳴あげるコマンド
しかないのですよ。

495 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 19:10:17.94 ]
今までなかったからこれからもないと信じるのはどうなのと思わなくもない

496 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 19:15:52.59 ]
>>483の脳内には現実に存在するみたいですよ。

497 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 22:17:38.36 ]
お前らって、本当、どうしようもないバカだよな

ちったぁ議論らしいことをしたいなら、前提について定義しろよ

お前ら何のOSの事を想定してんだ?Solarisか?AIXか?386BSDか?バージョンは?え?
使ってるコマンドはどこの物だ?OSについてきたコマンドか?GNUのやつか?バージョンは?え?

そこが全然明確じゃないから、いっつもいっつもループしてんのか前に進んでんだか
前にも進んでないんだか分からねえグダグダ展開になってんじゃねえか

お前らの脳内それぞれで、前提狂った状態で、全然違うOSの事で話をしてたって、
意味も価値も実りある結論も、何もありゃしねえんだよ

お前らって、本当、どうしようもないバカだよな

498 名前: 忍法帖【Lv=2,xxxP】 mailto:sage [2012/03/12(月) 22:21:20.93 ]
結局どっちがいいの?
find . -print0 | xargs -0 -I{} mv -vb {} ../tmp

とかした時って同名なのにバックアップ取られないファイルがあったんだけど、-exec +ならちゃんとバックアップされる?

499 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 22:24:10.73 ]
>>497
バカからも得られるものはあるものさ

バカってのはこういう事を考えてるんだ、こんな風に誤解してるんだ、その程度しか知らないんだ、
じゃあ分かってない人はその辺が分かっていないのかもしれないから、ちょっと注意しよう

そんな目線での考察や気づきは、やっぱりバカからしか得られないものなのさ

500 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 22:33:58.20 ]
分かりやすい自演

501 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 22:37:33.62 ]
>>498
find、xargs、mvの仕様、及びファイル名の状態(空白含んでるとか、日本語ファイル名だとか)次第

どんな名前のファイルがこようがこれなら何でもOKという万能包丁は、ぶっちゃけ無い

FAQにも割とマジで"Use Samba and explorer.exe"ともある

502 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 23:04:49.76 ]
バックグラウンドで何かを起動すると、
ジョブ番号とPIDが表示されるじゃないですか。
あれって表示させなくする方法ってあるんでしょうか?

時間のかかる処理をバックグラウンドで走らせて
その間に別の処理をやって、waitで同期する、
みたいなことをやるスクリプトで、邪魔なんですよね。




503 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 23:08:46.69 ]
>>498
両方使えば?っていう初心者の意見です

504 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/12(月) 23:19:19.45 ]
>>502
スクリプト実行しているシェルは何?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<212KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef