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

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

■ このスレッドは過去ログ倉庫に格納されています
0001うはwwwww2006/03/26(日) 00:56:22
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。
0525名無しさん@お腹いっぱい。2006/05/30(火) 23:37:57
>>524
./abc.sh > aaa.txt 2>&1
0526名無しさん@お腹いっぱい。2006/05/30(火) 23:39:45
>>524
スクリプトの一行目に、
echo -n $0
とか書いとけばいいんじゃないかと。
0527名無しさん@お腹いっぱい。2006/05/30(火) 23:42:56
>>526 は質問の意味をどう取り違えたのだろうか?
0528名無しさん@お腹いっぱい。2006/05/30(火) 23:57:10
set -v じゃだめなのかな?
0529名無しさん@お腹いっぱい。2006/05/30(火) 23:59:55
>>528 は質問の意味をどう取り違えたのだろうか?

つか、>>525 に答え出てるって。
0530名無しさん@お腹いっぱい。2006/05/31(水) 00:18:48
at- f abc.sh now + 1 minute
として数分待ってメールを読む
0531名無しさん@お腹いっぱい。2006/05/31(水) 08:46:30
> aaa.txt だと標準出力だけしか書き込まないから
2>&1ってつけると標準エラー出力もファイルに書き込む
0532名無しさん@お腹いっぱい。2006/05/31(水) 10:57:59
例えば
c123456 cs012
という文字列がhogehogeというファイルに記述されていた場合、
cs以下の数字3つを切り取り、それを変数numとする
更にその変数numに対して
整数a≦変数num≦整数b
という条件が満たされた場合にその旨を伝える

…というスクリプトを作っているのですが、どうもうまくいきません

if [ $num >= 0 ] ; then
if [ $num <= 61 ] ; then
echo
0533切れてる…orz2006/05/31(水) 11:01:11
if [ $num >= 0 ] ; then
if [ $num <= 61 ] ; then
echo "0 <= $num <= 61"
fi
fi

if [ $num >= 62 ] ; then
if [ $num <= 122 ] ; then
echo "62 <= $num <= 122"
fi
fi

と条件を指定したのですが、numの値如何に関わらず全てのecho文が表示されてしまいます
どうすればいいんでしょうか?
0534セル塩いちご2006/05/31(水) 11:23:27
>= を -ge に
<= を -le に

と直せばいいじゃないかな
0535名無しさん@お腹いっぱい。2006/05/31(水) 12:01:59
あと、カレントディレクトリに = というファイルができてしまってるはずだから、
削除するヨロシ。
0536名無しさん@お腹いっぱい。2006/05/31(水) 12:46:42
[ 0 -le $num -a $num -le 61 ]
とかの方が見やすそうな希ガス
0537名無しさん@お腹いっぱい。2006/05/31(水) 12:50:50
だったら、↓こういう書き方もあり。

if ((0 <= num && num <= 61)); then
0538名無しさん@お腹いっぱい。2006/05/31(水) 13:16:35
cshはこの辺が楽過ぎw
0539名無しさん@お腹いっぱい。2006/05/31(水) 17:48:58
cshは邪道
0540名無しさん@お腹いっぱい。2006/05/31(水) 17:53:53
>>537
罰手異存!
0541名無しさん@お腹いっぱい。2006/05/31(水) 17:56:48
ムゥ、罰手異存か……まだ使い手がいたとは……
0542名無しさん@お腹いっぱい。2006/05/31(水) 19:00:43
>>541
知っているのか雷電。
0543名無しさん@お腹いっぱい。2006/05/31(水) 20:21:14
>>534
そのようにすると「unary operator expected」と出て弾かれてしまいます…

>>535
分かりました。処理しておきます

>>536,537
すぐには無理ですが、明日にでも試してみます。ありがとうございます

>>538
諸事情によりshでやらなければならないので…残念です
0544名無しさん@お腹いっぱい。2006/05/31(水) 20:33:26
>>543
>そのようにすると「unary operator expected」と出て弾かれてしまいます…

だとすると、$numに何も代入されていない(空文字列)の可能性あり。

[ $num >= 62 ] だから、>= はリダイレクトとみなされ、引数ではないので
testコマンドには test $num 62 だけが渡り、$numが空文字列なので、
test 62 となって、これは62という文字列の長さが1以上あるので
常に真になる。

元の質問で常に真になるという現象の説明が付く。

ちなみに、正しく$numに代入されていれば、
[ $num -ge 62 ] で動かないとおかしい。
0545名無しさん@お腹いっぱい。2006/05/31(水) 21:05:05
そもそも$numにどうやって代入してるん?
テキストから読み取って代入ってシェルだと結構難しいよ
awkとかでやってるのか?
0546名無しさん@お腹いっぱい。2006/05/31(水) 21:27:49
>>545
えーっとですね…種明かしをすると、大学の課題の一環なんです。
手元にスクリプトファイルがないので、明日また質問させていただきます。
因みにawkは使わず(使い方がよく分からない)、sedで例としてあげたcs012の"012"部分を切り取って使っています。
先生によるとそれが文字列として認識されており、整数に直す処理をしてやればよいのではないか…との事です。
んが、そのやり方が分からずに困ってます…
0547名無しさん@お腹いっぱい。2006/05/31(水) 21:33:32
>>546
本当に先生がそう言ったのならその先生は信用しない方がいい。
シェルスクリプトの変数では文字列と整数を区別しない。
(testコマンドでの判定時に演算子によって区別するだけ)

あと、宿題なら回答はこれで打ち切る。
0548名無しさん@お腹いっぱい。2006/05/31(水) 23:26:11
>>546
だからそのsedで抜き出してる処理の部分を詳しく
そこが間違ってたらもともこもねえじゃん
012の部分を切り取ってるソースをここに書け
0549名無しさん@お腹いっぱい。2006/05/31(水) 23:52:48
整数の場合を分け、比較に >= <= を使う shell となると… まさか、csh?
0550名無しさん@お腹いっぱい。2006/06/01(木) 02:15:27
bash $ [ 010 -gt 8 ] && echo ok
ok

へー、これでもエラーでないのか。
知らなかった。
05515462006/06/01(木) 14:31:53
#!/bin/sh
friend="$HOME/.friendlist"
friend2="$HOME/.friendlist2"

echo "Do you use me?---y/n"
read first
while test x"$first" = xy
do

w | grep -v pts | sort | sed 's/\([^ ]*\) :0\/\([^ ]*\) *[^ ]* *[^ ]* *[^ ]* *[^ ]* *[^ ]*/\1\2/' | cat >>$friend

read first
for i in $first
do
grep "$i" $friend | cat >>$friend2
set tmp=`sed 's/^c[0-9]\{6\} cs\([0-9]\{3\}\)/\1/' $friend2`
num=`$tmp >& /dev/null`
echo "
$i is here.
"
grep "$i" $friend2
echo ""
done
0552名無しさん@お腹いっぱい。2006/06/01(木) 14:38:24
>>551
num=`$tmp >& /dev/null`

↑/dev/nullに捨ててどうするw こりゃだめだ。
0553名無しさん@お腹いっぱい。2006/06/01(木) 14:54:18
>>552
該当行を削除してif構文を>>537さんの提示してくれた文に書き換えた結果、エラーは吐き出されなくなったものの
if ((0 <= num && num <= 61)) ; then
echo "$i is in \"2nd bld.101A\"."
fi

if ((62 <= num && num <= 122)) ; then
echo "$i is in \"2nd bld.109A\"."
fi

if ((123 <= num && num <= 142)) ; then
echo "$i is in \"20th bld.107\"."
fi

if ((143 <= num && num <= 162)) ; then
echo "$i is in \"20th bld.619\"."
fi

if ((201 <= num && num <= 245)) ; then
echo "$i is in \"20th bld.310\"."
fi

if ((301 <= num && num <= 320)) ; then
echo "$i is in \"20th bld.413\"."
fi

if ((321 <= num && num <= 340)) ; then
echo "$i is in \"20th bld.613\"."
fi
のようにしているのにnumの値に関わらず一番最初の処理しか実行されません…
0554名無しさん@お腹いっぱい。2006/06/01(木) 15:01:42
>>553
>該当行を削除して

削除してどうする。/dev/nullに捨てるのだけが余計。その他は必要。
あと、その前の行の set もおかしい。
これ本当にに自分で理解して書いたスクリプトじゃないだろ。
もっとシェルスクリプトの基本からやり直した方がいい。

0555名無しさん@お腹いっぱい。2006/06/01(木) 15:19:45
>>554
了解しました。確かに、理解せずに書いた部分がほとんどです。
勉強して出直すことにします。ありがとうございました。
0556セル塩いちご2006/06/01(木) 23:02:54
>>555

----
#!/bin/sh
set -x
----

と、「set -x」をつけて動かしてデバッグするといいじゃないかな
0557名無しさん@お腹いっぱい。2006/06/02(金) 11:57:20
----
#!/bin/sh -x
----
でいいんじゃないかな
0558名無しさん@お腹いっぱい。2006/06/02(金) 12:50:40
ファイルの頭から何バイト目を0xffとかに書き換えるってシェルスクリプトでどうやればよいでしょうか?
0559名無しさん@お腹いっぱい。2006/06/02(金) 12:54:53
>>558
perl使っちゃえよ。
0560名無しさん@お腹いっぱい。2006/06/02(金) 13:03:36
シェルスクリプトで八進数→十進数に変換する方法ってないものだろうか?
探しているんだが全然見つからん…orz
0561名無しさん@お腹いっぱい。2006/06/02(金) 13:09:14
>>560
bc使っちゃえよ。
0562名無しさん@お腹いっぱい。2006/06/02(金) 13:37:19
>>558
ヒント: head -c; tail -c

>>560
$ printf '%d\n' 0377
255
0563名無しさん@お腹いっぱい。2006/06/02(金) 13:49:34
>>562
サンクス。こんなやり方があったのか…
0564名無しさん@お腹いっぱい。2006/06/02(金) 14:56:10
$ echo 'ibase=8;377' | bc
255
$ perl -e 'print 0377,"\n";'
255
$
0565名無しさん@お腹いっぱい。2006/06/02(金) 23:45:58
シェルスクリプトの中で実行時間がちと長く掛かるコマンドを
実行している時に , 標準出力にディスプレイ 風車 ? が回って
いる様にみせるにはどうすればいいでしょうか ?
0566名無しさん@お腹いっぱい。2006/06/03(土) 02:51:19
俺はdcが大好き!

$ echo '8i377p' | dc
255
0567名無しさん@お腹いっぱい。2006/06/03(土) 03:10:32
>>565
ヒントをやるから後は自分でアレンジしな。

for i in a b c
do
echo -en "$i\r"
sleep 1
done
0568名無しさん@お腹いっぱい。2006/06/03(土) 08:02:28
bc って echo で標準入力にいれないと
ワンライナー計算ができないのが面倒くさい。
bc -e '1+2'
くらいできてもいいのに。
0569名無しさん@お腹いっぱい。2006/06/03(土) 08:32:25
>>568
dcは出来る子。
0570名無しさん@お腹いっぱい。2006/06/03(土) 11:44:41
>>568
exprは出来る子。
0571名無しさん@お腹いっぱい。2006/06/03(土) 12:02:32
bc…恐ろしい子!
0572名無しさん@お腹いっぱい。2006/06/03(土) 14:21:54
いまはprintfコマンドは普通にどこでもはいってるよね?
なんでつかわないんだろ。
0573名無しさん@お腹いっぱい。2006/06/03(土) 14:43:15
入ってなかったらいやだからw

最近ようやくどの新しいOSにでも入ってる状態になったってことは、
後10年くらいしたらどこで使っても問題ないかなって感じだ。
0574名無しさん@お腹いっぱい。2006/06/03(土) 17:10:36
規格的にはX/Open System Interface issue 4から入ってるらしいよ。1994年発行。
自分は今Solarisを使っているんだが、 実は2.5.1にはすでに入ってたのね。知らなかった。
0575名無しさん@お腹いっぱい。2006/06/03(土) 19:13:50
>567

ありがとう。
ps で実行したコマンドのプロセスを確認と絡めて
うまい具合に作れました。
0576名無しさん@お腹いっぱい。2006/06/03(土) 23:48:49
>>568
#!/bin/sh
echo "$@" | bc
0577名無しさん@お腹いっぱい。2006/06/03(土) 23:53:14
出来る子$@が恐ろしい子bcをかばったって感じ?
0578名無しさん@お腹いっぱい。2006/06/17(土) 01:14:46
教えて下さい!

finde ./ の結果が

AAA
AAA/BBB
AAA/BBB/hoge1.txt
AAA/BBB/hoge2.txt
AAA/BBB/hoge3.txt
AAA/BBB/CCC/hoge4.txt
AAA/BBB/CCC/DDD
AAA/BBB/CCC/DDD/EEE
AAA/BBB/FFF/GGG/hoge5.txt
AAA/BBB/FFF/GGG/hoge6.txt
AAA/BBB/FFF/GGG/HHH
AAA/BBB/FFF/III/hoge7.txt
AAA/BBB/FFF/III/JJJ
AAA/BBB/FFF/III/JJJ/KKK
AAA/BBB/FFF/III/JJJ/KKK/LLL
AAA/BBB/FFF/III/JJJ/KKK/LLL/MMM

となっていて、ツリーにファイルを持たないフォルダのみを
抜き出したいです。
0579名無しさん@お腹いっぱい。2006/06/17(土) 01:15:24
↓こんな感じです。

AAA/BBB/CCC/DDD
AAA/BBB/CCC/DDD/EEE
AAA/BBB/FFF/GGG/HHH
AAA/BBB/FFF/III/JJJ
AAA/BBB/FFF/III/JJJ/KKK
AAA/BBB/FFF/III/JJJ/KKK/LLL
AAA/BBB/FFF/III/JJJ/KKK/LLL/MMM

先輩は、find . -type d -emptyと言い残して旅に出ましたが
動きませんでした…

OSはこれです。シェルがどうこうはよくわかりません。。。
SunOS devcvs01 5.9 Generic_118558-05 sun4u sparc SUNW,UltraAX-i2
0580名無しさん@お腹いっぱい。2006/06/17(土) 02:56:59
>>579 動きませんでした…
実はちゃんと動いている、に1票。
動かしてみたらどうなったか具体的に書いてみ。

あと、次に>>578がここに戻ってくるときまでには、
先輩が教えたオプションの意味をman見て100%理解しとけよ。
0581名無しさん@お腹いっぱい。2006/06/17(土) 08:52:40
>>579
先輩はガソリンが空っぽになったので探しながら旅をしてる

まで読んだ
05825782006/06/17(土) 08:55:24
-emptyが無効みたいなエラーだったとおもいます。
また、UNIXのコマンドのfindのとこに-emptyオプションがなかったです。
0583名無しさん@お腹いっぱい。2006/06/17(土) 09:22:50
んじゃ、-empty に相当するチェック処理を別に書けばよい。
0584名無しさん@お腹いっぱい。2006/06/17(土) 10:25:12
-empty を使うと結果は >>579 ではなく
AAA/BBB/CCC/DDD/EEE
AAA/BBB/FFF/GGG/HHH
AAA/BBB/FFF/III/JJJ/KKK/LLL/MMM
になるはず。AAA/BBB/CCC/DDD の下に AAA/BBB/CCC/DDD/EEE があるから
-empty でひっかからない。

-type d でひっかかったディレクトリのそれぞれにファイルがあるかどうかを
ひとつずつ地道に調べるしかないんじゃ?
0585名無しさん@お腹いっぱい。2006/06/17(土) 11:18:24
findの結果をfindで調べればよいな。
05865782006/06/17(土) 11:49:13
>>584
地道に調べてるのですが、いかんせんフォルダが10000くらいあって
そのうちの500フォルダくらいが空のようですが、目視はなんとも精度が低く

>>585
すみません、どんな感じにやるのですか?
0587名無しさん@お腹いっぱい。2006/06/17(土) 12:06:31
#! /bin/sh
find $1 -type f|grep '^$' >/dev/null

みたいなシェルスクリプトを使うのか?
0588名無しさん@お腹いっぱい。2006/06/17(土) 12:14:16
>>578

Solarisのfindには、-emptyオプションが無い件については、
↓で代用できる。

find . -type d -links 2

で、サブディレクトリがあって空の場合に、
親ディレクトリは引っかからないという問題はあるけど、
どうせ、その空のディレクトリを消したいんだろ?

なら、末端の空のディレクトリを消して、再び
↑のfindをすることを数回繰り返せば、目的は果たせる。
05895782006/06/17(土) 12:18:16
最終的には消すのが目的なのですが、先に消してもいいフォルダの
一覧をこさえて提出しないと、鬼が怒るという問題があるのです

-emptyないのですか…
0590名無しさん@お腹いっぱい。2006/06/17(土) 15:12:39
#!/usr/bin/perl
use File::Find;
no warnings File::Find;
do {
my %not_empty;
find({'bydepth'=>1, 'no_chdir'=>1,
'wanted'=>sub {
my $dir = $File::Find::dir;
my $name = $File::Find::name;
if (-d $name) {
return if (defined ($deleted{$name}));
if (! defined ($not_empty{$name})) {
$deleted{$name} = 1;
return;
}
}
$not_empty{$dir} = 1;
}},'.');
$old = $new;
$new = length(keys %not_empty);
} while ($old!=$new);

print join("\n",sort keys %deleted) ,"\n";

長過ぎ。シェルスクリプトじゃないし。しかも、この出力をrm -rf できないし。
0591名無しさん@お腹いっぱい。2006/06/17(土) 15:50:18
こんな感じ

#!/bin/sh
for x in `find $1 -type d` ; do
find $x -maxdepth 1 -type f | grep . > /dev/null
if [ $? -eq 0 ] ; then
continue
fi
echo $x
done

環境が違うんでgrepの違いとかは適当に直して呉
リンクの有無とかもチェックするなら3-6行を増やせ

>589
結果に責任は持たんから怒られる覚悟はしとけw
05925912006/06/17(土) 16:01:10
>589
実はあのままだと怒られるパターンがあるが、詳しく書かないでおく。
0593名無しさん@お腹いっぱい。2006/06/17(土) 17:04:33
>>591
Solarisの findには -maxdepthオプションがないというのがオチ。

あと、シェル変数を " " してないから、いろいろ危ない。
0594名無しさん@お腹いっぱい。2006/06/17(土) 17:23:24
1 find でディレクトリの一覧を得る find . -type d > a
2 find でディレクトリ以外の一覧を得る find . ! -type d > b
3 2 で得られたものから、dirname の一覧を作る
cat b | sed 's,/[^/]*$,,' > c1
cat c1 | sed 's,/[^/]*$,,') > c2
以下、最も深い階層回繰り返し。
4 1 にしか含まれないものを創る cat a c1 c1 c2 c2 ... |sort |uniq -u
0595名無しさん@お腹いっぱい。2006/06/17(土) 19:13:07
俺なら、指定されたディレクトリが条件を満たすかどうか調べるコマンドを作って、
それを find から -exec で起動するかな
0596名無しさん@お腹いっぱい。2006/06/17(土) 19:43:52
ls -aRF | awk '/:$/{d=$0;next}NF==0{if(!f)print d;f=0;next}!/\/$/{f=1}'

ディレクトリの末尾に余計なコロンがついてるが気にするな。
最上位のディレクトリだけはディレクトリだけあってファイルがひとつもなくても
結果に出てこないがそれ以外は正しいはず。目視で確認してくれ。
改行コードを含むディレクトリだとかコロンで終わるファイルとかあると
おかしな結果になるがそれ以外は正しいはず。そんなファイルを作るな(w
0597名無しさん@お腹いっぱい。2006/06/17(土) 20:22:53
>593
あと、サ(ry
0598名無しさん@お腹いっぱい。2006/06/17(土) 20:39:00
du
でいいじゃん
0599名無しさん@お腹いっぱい。2006/06/18(日) 00:04:44
>>598
だめだろ。duじゃディレクトリが空か判定できんぞ。
0600名無しさん@お腹いっぱい。2006/06/18(日) 00:20:51
rmdir しまくれば?
0601名無しさん@お腹いっぱい。2006/06/18(日) 00:58:37
反則技
rsync -avn
find
diff
0602名無しさん@お腹いっぱい。2006/06/18(日) 06:21:08
>>599
使用ファイルサイズで分かる。
0603名無しさん@お腹いっぱい。2006/06/18(日) 06:45:04
>591
あ、-maxdepthなんか無い方が目的に適うことに気づいてしまったw
0604名無しさん@お腹いっぱい。2006/06/18(日) 20:05:24
>>602
いや、わからないですね。
ディレクトリ内のファイルの作成削除の履歴&OSによるディレクトリ管理の方法によっては、
ファイルが全くなくてもディレクトリのサイズが巨大になる場合がありえるものなんです。
0605名無しさん@お腹いっぱい。2006/06/19(月) 16:52:37
シェルスクリプト内で外部プログラムを呼び出したとき、
メモリ制限やプロセス数制限でプロセス生成に失敗すると、
シェルスクリプト本体が終了してしまいますが、
終了させずに次の行へ処理を進める方法はありますか?
一定時間ウェイトしてから、リトライさせたいのですが…
0606名無しさん@お腹いっぱい。2006/06/19(月) 17:13:55
>>604
サンプル希望
0607名無しさん@お腹いっぱい。2006/06/19(月) 17:41:23
>>606
FAT
0608名無しさん@お腹いっぱい。2006/06/19(月) 17:51:34
>>606
$ uname -a
FreeBSD xxx 7.0-CURRENT FreeBSD 7.0-CURRENT #13: Tue May 9 14:37:19 JST 2006 xxx i386
$ mkdir /tmp/testdir
$ ls -ld /tmp/testdir
drwxr-xr-x 2 xxxx xxxx 512 Jun 19 17:40 /tmp/testdir
$ for f in $(jot 1000);do touch /tmp/testdir/$f;done
$ ls -ld /tmp/testdir
drwxr-xr-x 2 xxxx xxxx 12288 Jun 19 17:41 /tmp/testdir
$ rm /tmp/testdir/*
$ ls -ld /tmp/testdir
drwxr-xr-x 2 xxxx xxxx 12288 Jun 19 17:41 /tmp/testdir

他人にサンプル要求してるんだから「使用ファイルサイズで分かる」サンプルも提示しろよ。
0609名無しさん@お腹いっぱい。2006/06/19(月) 19:36:34
>>608
Linuxなんだけど
$mkdir -p /tmp/testdir/test{1,2}
$for aa in `seq 10`; do mkdir /tmp/testdir/test1/aa$aa; done
$du -b /tmp/testdir/ |sort -nr
53248 /tmp/testdir
45056 /tmp/testdir/test1
4096 /tmp/testdir/test2
4096 /tmp/testdir/test1/aa9
4096 /tmp/testdir/test1/aa8
4096 /tmp/testdir/test1/aa7
4096 /tmp/testdir/test1/aa6
4096 /tmp/testdir/test1/aa5
4096 /tmp/testdir/test1/aa4
4096 /tmp/testdir/test1/aa3
4096 /tmp/testdir/test1/aa2
4096 /tmp/testdir/test1/aa10
4096 /tmp/testdir/test1/aa1
空のディレクトリは最小サイズだよ。
0610名無しさん@お腹いっぱい。2006/06/19(月) 20:03:50
そこで、
touch /tmp/testdir/test2/hoge
してファイルを作成してみるとどうなるか。
0611名無しさん@お腹いっぱい。2006/06/19(月) 20:06:56
>>608
おんなじことを Linux-2.4.20 で追試させてもらった。
やっぱ同様にファイルが1つもないのに/tmp/testdirが12288と大きいままだったわい。
0612名無しさん@お腹いっぱい。2006/06/19(月) 23:40:21
>>609
空じゃないディレクトリでも最小サイズだな。
もっとも真に空のディレクトリが存在したらファイルシステムが壊れているという事だけど。

$ mkdir /tmp/testdir
$ ls -ld /tmp/testdir
drwxr-xr-x 2 xxxx xxxx 4096 Jun 20 00:54 /tmp/testdir
$ touch /tmp/testdir/1
$ ls -ld /tmp/testdir
drwxr-xr-x 2 xxxx xxxx 4096 Jun 20 00:54 /tmp/testdir
0613名無しさん@お腹いっぱい。2006/06/20(火) 00:05:48
ファイルシステムによるよ。
linux の reiserfs3 だと
mkdir a
drwxr-xr-x 2 xxxx xxxx 48 Jun 20 00:03 a/
touch a/hoge
drwxr-xr-x 2 xxxx xxxx 72 Jun 20 00:03 a/
rm a/hoge
drwxr-xr-x 2 xxxx xxxx 48 Jun 20 00:03 a/
06146042006/06/20(火) 00:31:51
>>613
おっしゃるとおりです。OSとか「ファイルシステムによる」わけです。
だから、そういうことに依存したスクリプトは書いてはいけないでしょう。

最低限、>>598,602のような表明には、「XXXファイルシステムとか△△△OSでは」
という条件を付さねばならなかったわけです。
06156042006/06/20(火) 00:34:20
うっ、でも今回の場合環境がSolarisと決まってたんだっけ。(>>579)

ニゲヨット。
0616名無しさん@お腹いっぱい。2006/06/20(火) 00:42:59
>>613に一俵。Solarisだけど、ufs(logging付き)では
% ls -ld
drwxr-xr-x 2 xxxx users 512 Jun 20 00:38 .
% touch `yes '' | head -1000 | cat -n` ; ls -ld
drwxr-xr-x 2 xxxx users 12288 Jun 20 00:38 .
% rm * ; ls -ld
drwxr-xr-x 2 xxxx users 12288 Jun 20 00:38 .

みたいにサイズが戻らないけど、swapfs(仮想メモリディスク)上だと

% ls -ld
drwxr-xr-x 2 xxxx users 117 Jun 20 00:37 .
% touch `yes '' | head -1000 | cat -n`; ls -ld
drwxr-xr-x 2 xxxx users 60010 Jun 20 00:37 .
% rm *; ls -ld
drwxr-xr-x 2 xxxx users 117 Jun 20 00:37 .

みたいに元に戻る。
0617名無しさん@お腹いっぱい。2006/06/20(火) 10:41:17
割り込んですみません
>608 の jot って coreutils ( sh-utils だった ?) の seq みたいなのですか ?
0618名無しさん@お腹いっぱい。2006/06/20(火) 11:08:27
>>617
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=jot&dir=jpman-5.4.0%2Fman§=0
0619名無しさん@お腹いっぱい。2006/06/20(火) 11:09:14
>>617
そうです。
JOT(1) FreeBSD General Commands Manual JOT(1)
NAME
jot -- print sequential or random data
SYNOPSIS
jot [-cnr] [-b word] [-w word] [-s string] [-p precision]
[reps [begin [end [s]]]]
0620名無しさん@お腹いっぱい。2006/06/20(火) 12:02:34
わかりくいコマンド名だな
0621名無しさん@お腹いっぱい。2006/06/20(火) 12:20:58
>618-819 ありがとうございました。
0622名無しさん@お腹いっぱい。2006/06/20(火) 12:22:19
↑ 訂正
>618-619 ありがとうございました。
0623名無しさん@お腹いっぱい。2006/06/20(火) 13:29:03
The name jot derives in part from iota, a function in APL.
だそうだ。
0624名無しさん@お腹いっぱい。2006/06/20(火) 19:34:24
hoge.txt というファイルが存在したらメールで知らせる、
というシェルスクリプトきぼんぬ
■ このスレッドは過去ログ倉庫に格納されています