ls -l でファイルの更新時刻を取ろうとしても、
6ヶ月以上前のものは "%b %d %Y" になってしまい時刻まで取れません。
NetBSDのlsなんかは ls -T で完全なmtimeとれるみたいですが、
shell+汎UNIXなコマンドでは「できない」てことでいいんでしょうか?
#もちろんstat().mtimeするバイナリを書けばいいんだがそれは反則
#perl,tclなんかも反則とします
--
kabe
In the message <420427032002...@sra-tohoku.co.jp>
<ka...@sra-tohoku.co.jp> wrote:
> ls -l でファイルの更新時刻を取ろうとしても、
> 6ヶ月以上前のものは "%b %d %Y" になってしまい時刻まで取れません。
>
> NetBSDのlsなんかは ls -T で完全なmtimeとれるみたいですが、
> shell+汎UNIXなコマンドでは「できない」てことでいいんでしょうか?
>
> #もちろんstat().mtimeするバイナリを書けばいいんだがそれは反則
> #perl,tclなんかも反則とします
find -type f -print "%TY/%Tm/%Td %TH:%TM:%TS\n"
とか.
--
岡田 健一 mailto:ok...@opaopa.org
> NetBSDのlsなんかは ls -T で完全なmtimeとれるみたいですが、
> shell+汎UNIXなコマンドでは「できない」てことでいいんでしょうか?
FreeBSDのlsにも「-T」はあるようです。ということはBSD 4.4くらい
からあったりしないのかな。
汎UNIXとは、とうい話になったりして。 久野
In the message <apfco8$4...@utogw.gssm.otsuka.tsukuba.ac.jp>
ku...@gssm.otsuka.tsukuba.ac.jp wrote:
> > NetBSDのlsなんかは ls -T で完全なmtimeとれるみたいですが、
> > shell+汎UNIXなコマンドでは「できない」てことでいいんでしょうか?
> FreeBSDのlsにも「-T」はあるようです。ということはBSD 4.4くらい
> からあったりしないのかな。
GNU fileutils の ls では --full-time のようです.
Solaris の ls には、なさげです.
一時期、GNUのlsでは-eが--full-timeと同義だったらしいです。今はないです
ね。-TはGNUのlsだと--tabsizeと同義なのでややこしい。
これまた「汎UNIXとは」という話になりそうですが、touchで特定のタイムス
タンプの空ファイルを作成してはtest -ntで対象ファイルと比較し、二分法で対
象ファイルのタイムスタンプを求めるというのをふと思いつきました。
これはだめですね。昔のUNIXのtouchは秒単位を指定できないのでした。
fj.unix.shells の <apg73e$9...@utogw.gssm.otsuka.tsukuba.ac.jp> の記事において
2002-10-27(日) 17:11頃、ku...@gssm.otsuka.tsukuba.ac.jpさんは書きました。
> 久野です。
>
> ni...@ics.nara-wu.ac.jpさんは書きました。
> > これはだめですね。昔のUNIXのtouchは秒単位を指定できないのでした。
>
> dateでその時分秒になって作るというのは? :-) 久野
TZ をずらしながら日付が変わるoffset を調べるというのは? :-)
mistral% env TZ=___-14:49:7 ls -l /COPYRIGHT
-r--r--r-- 1 root wheel 4735 4 21 2001 /COPYRIGHT
mistral% env TZ=___-14:49:8 ls -l /COPYRIGHT
-r--r--r-- 1 root wheel 4735 4 22 2001 /COPYRIGHT
# TZ なしだと 2001.04.21 09:10:52 のファイル
shell script で実装するのは面倒そう……
--
猿丸芳彦 (Yoshihiko SARUMARU)
mail: mis...@imasy.or.jp web: http://www.imasy.or.jp/~mistral/
<ka...@sra-tohoku.co.jp> wrote in message
news:420427032002...@sra-tohoku.co.jp...
> ls -l でファイルの更新時刻を取ろうとしても、
> 6ヶ月以上前のものは "%b %d %Y" になってしまい時刻まで取れません。
>
> NetBSDのlsなんかは ls -T で完全なmtimeとれるみたいですが、
> shell+汎UNIXなコマンドでは「できない」てことでいいんでしょうか?
tar cf - ファイル名 | tar tvf -
とか?
(デカいファイルだと、全然嬉しくないけど…)
記事 <3DBBC46B...@coral.ocn.ne.jp> で
Tadamasa Tamuraさんは書きました
> tar cf - ファイル名 | tar tvf -
> とか?
> (デカいファイルだと、全然嬉しくないけど…)
それなら、エラーは無視するとして
tar cf - ファイル名 | head -c 512 | tar tvf -
はどうでしょうか?
PROJECT TEAM DoGA 高津正道 ta...@doga.jp
TBD0...@nifty.ne.jp
PROJECT TEAM DoGAのホームページ → http://doga.jp/
10月28日(月) 今日のマーフィーの法則 [一般法則]
宇宙の混沌は常に増大している。
ka...@sra-tohoku.co.jp wrote:
> ls -l でファイルの更新時刻を取ろうとしても、
> 6ヶ月以上前のものは "%b %d %Y" になってしまい時刻まで取れません。
>
> NetBSDのlsなんかは ls -T で完全なmtimeとれるみたいですが、
> shell+汎UNIXなコマンドでは「できない」てことでいいんでしょうか?
>
> #もちろんstat().mtimeするバイナリを書けばいいんだがそれは反則
> #perl,tclなんかも反則とします
日付の表示形式が共通かどうかわかりませんが
tar コマンドは使えないでしょうか?
$ tar -cf - files | tar -tvf -
Digital UNIX V4.0D では秒まで表示されます。
--
NARUMI,Hidetoshi
> tar cf - ファイル名 | head -c 512 | tar tvf -
> はどうでしょうか?
ウチでは head に -c が使えませんでした。ということで
tar cf - ファイル名 | dd count=1 | tar tvf -
--
持田 修司 NETside Technologies Inc.
-- Equal Opportunity for All Good Architectures, NetBSD. --
solarisの/bin/tarでは秒まで出ないようです。
ni...@ics.nara-wu.ac.jp
>ls -l でファイルの更新時刻を取ろうとしても、
>6ヶ月以上前のものは "%b %d %Y" になってしまい時刻まで取れません。
>NetBSDのlsなんかは ls -T で完全なmtimeとれるみたいですが、
>shell+汎UNIXなコマンドでは「できない」てことでいいんでしょうか?
私は、たいていは
diff -c ファイル名 /dev/null | head -1
でやっつけて、それがダメそうな相手には
pr ファイル名 | head -3
という技ですませます。ただ、prは秒が出ないので、完全じゃないですが…。
=======================================================================
安岡孝一@京都大学人文科学研究所附属漢字情報研究センター
http://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/
=======================================================================
(-printfて)GNU findの独自機能ですよね?
--
kabe
> diff -c ファイル名 /dev/null | head -1
ファイルサイズが 0 だと….
# 私なら作るかパッチあてるかだなあ. いくらフィルタ文化圏だといっても目
# 的に対してコストが見合っていない気がする.
--
Kazuo Fox Dohzono / doh...@hf.rim.or.jp
バイナリファイルとかディレクトリの場合にも困りますよね。
> # 私なら作るかパッチあてるかだなあ. いくらフィルタ文化圏だといっても目
> # 的に対してコストが見合っていない気がする.
まあ、条件が「作るのは反則」となっている時点で実用性は別ということで。
tar というのは盲点でしたが
<aph2oo$2qdp$1...@maha2.doga.co.jp>の記事において
ta...@doga.jpさんは書きました。
>> > tar cf - ファイル名 | tar tvf -
>> > とか?
>> > (デカいファイルだと、全然嬉しくないけど…)
>>
>> それなら、エラーは無視するとして
>> tar cf - ファイル名 | head -c 512 | tar tvf -
これでもデカいファイルでは嬉しくないことには変わりない
んですが
touch -r target tmp
tar cf - tmp | tar tvf -
という合わせ技を思いつきました。
あとは tar v の出力形式にどのくらいバリエーションがあるかですかね。
Solaris:
-rw-r--r-- user/group 0 2000-01-01 00:00 tmp
GNU tar: (同じかい…)
-rw-r--r-- user/group 0 2000-01-01 00:00 tmp
秒まではとれんよーですが。
#うまくすればawk使わなくても set -- だけで切り出せるか?
--
kabe
バイナリファイルとかディレクトリの場合にも困りますよね。
> # 私なら作るかパッチあてるかだなあ. いくらフィルタ文化圏だといっても目
> # 的に対してコストが見合っていない気がする.
まあ、条件が「バイナリを作るのは反則」となっている時点で、実用性は度外
視ということで。
ni...@ics.nara-wu.ac.jp
今時「ふつー」はperlで一発なんではないでしょうか。UNIX汎用に限るから難
しいわけで。
> GNU tar: (同じかい…)
> -rw-r--r-- user/group 0 2000-01-01 00:00 tmp
手元のGNU tar 1.13.25は秒まで吐きますが…
ni...@ics.nara-wu.ac.jp
In article <apikru$if1$1...@caraway.media.kyoto-u.ac.jp>, yas...@kanji.zinbun.kyoto-u.ac.jp (Koichi Yasuoka) writes
> diff -c ファイル名 /dev/null | head -1
う、こんなに使うくらいだったらC/Perl で書いているな。
もともとのC/Perlはだめってのは、どうしてそういう制限なんだろう?
---
Shinji KONO @ Information Engineering, University of the Ryukyus,
PRESTO, Japan Science and Technology Corporation
河野真治 @ 琉球大学工学部情報工学科,
科学技術振興事業団さきがけ研究21(機能と構成)
記事 <205028200215...@sra-tohoku.co.jp> で
kabeさんは書きました
> > それなら、エラーは無視するとして
> > tar cf - ファイル名 | head -c 512 | tar tvf -
> これでもデカいファイルでは嬉しくないことには変わりない
> んですが
head なり dd なりが読み込みを終わらせた時点で、
SIGPIPE で tar cf の方は終了しますから、
デカいファイルが対象でも実行はすぐに終わります。
それとも、他に嬉しくないことがあるのでしょうか?
> > > diff -c ファイル名 /dev/null | head -1
> 実用性は度外視
安岡さんは実際に用いられているようですよ.
# どうせならシステムコールを呼び出す *だけ* のプログラム群を作ってパイ
# プで繋げて… :-)
In article <3DBBC46B...@coral.ocn.ne.jp>,
Tadamasa Tamura <ta...@coral.ocn.ne.jp> wrote:
>田村です。
>> NetBSDのlsなんかは ls -T で完全なmtimeとれるみたいですが、
>> shell+汎UNIXなコマンドでは「できない」てことでいいんでしょうか?
>
>tar cf - ファイル名 | tar tvf -
OpenBSD や Darwin の tar は pax 由来の実装になっているよう
で、ls の出力と同様、時刻情報と年情報とを共用しているみたい
ですけど。
UNIX 標準コマンドでも、ちょっと複雑なものになると些末の仕
様が OS 依存になってしまうことが多いですね。
--
しらい たかし
"Takashi SHIRAI" <shi...@nintendo.co.jp> wrote in message
news:apjq2t$edf$1...@nsvn01.zaq.ne.jp...
> しらいです。
>
> >> NetBSDのlsなんかは ls -T で完全なmtimeとれるみたいですが、
> >> shell+汎UNIXなコマンドでは「できない」てことでいいんでしょうか?
> >
> >tar cf - ファイル名 | tar tvf -
>
> OpenBSD や Darwin の tar は pax 由来の実装になっているよう
> で、ls の出力と同様、時刻情報と年情報とを共用しているみたい
> ですけど。
ありゃりゃ。
まだ、胃^H井の中の蛙でしたか。
やはりここは、「スーパーユーザになって、日付を戻す」しかっ。
#でも、日付の前後関係だけなら、ls -tでも維持するはずだよなぁ…
>> SIGPIPE で tar cf の方は終了しますから、
>> デカいファイルが対象でも実行はすぐに終わります。
>> それとも、他に嬉しくないことがあるのでしょうか?
パイプがバッファリングを行っていると、カーネルにいらん負荷が
かかるような気がしたので。
まバッファがあっても4kB単位とかでしょうから
普通はたいしたことないんでしょうけど。
#バッファつきパイプは違反(何のだ)でしたっけ
SIGPIPEを無視するtarはないと思いますが
--
kabe
# tarのヘッダのフォーマットのバリエーションっていくつくらいあるんでしょう
> いっそtar cf - filenameの出力をod -vして、ヘッダ部分をawkあたりで解析
> するとか。時刻情報自体は秒単位まで記録されているでしょうから。
tar cf - filename|dd bs=1 skip=136 count=12
ですかねぇ。ただ、time_t な値が 8進で記録されているだけなので、
年月日時分秒に変換する必要がありますが、awk とかで変換できましたっけ?
> # tarのヘッダのフォーマットのバリエーションっていくつくらいあるんでしょう
基本的には、オリジナルの形式から POSIX と GNU に分岐していると言うかん
じだと思います。細かくは GNU のがいくつかあったり、star が POSIX と
GNU の形式をちゃんぽんでつかうとかいろいろあるようですけれど。
--
[田中 哲][たなか あきら][Tanaka Akira]
「ふえろ! わかめちゃん作戦です⊇」(Little Worker, 桂遊生丸)
> NetBSDのlsなんかは ls -T で完全なmtimeとれるみたいですが、
> shell+汎UNIXなコマンドでは「できない」てことでいいんでしょうか?
結局、問題は秒をいかに得るかというわけですが、不可能ではない気がしたの
で、なんとなく線形探索で求めてみました。まぁ、2分探索にすることもでき
るでしょうし、POSIX に従った(閏秒のない)環境を前提にするなら、探索する
までもなく mtime % 60 で済む話ではありますが。
なお、tar を使ってもいいと思うんですが、バイナリを扱うのは厄介なので、
ar を使いました。そのため、大きなファイルについて非効率極まりない上、
ファイル名に空白が入っていたり、昔の(current ar archive でないフォーマッ
トを扱う) ar だと動かない気もします。また、後から気がついたのですが、
current ar archive を扱うこともできないようで... やっぱ tar のほうがま
しだったかもしれません。
#!/bin/sh
tmp=/tmp/mtime.a
filename=$1
rm -f $tmp
ar cq $tmp $filename
mdhm="`ar tv $tmp|awk '{print $(NF-4) \" \" $(NF-3) \" \" $(NF-2)}'`"
year=`ar tv $tmp|awk '{print $(NF-1)}'`
#echo "$mdhm $year"
mtime=`awk 'NR == 2 {print $2}' $tmp`
#echo $mtime
for i in 0 1 2 3 4 5 6 7 8 9 \
10 11 12 13 14 15 16 17 18 19 \
20 21 22 23 24 25 26 27 28 29 \
30 31 32 33 34 35 36 37 38 39 \
40 41 42 43 44 45 46 47 48 49 \
50 51 52 53 54 55 56 57 58 59 \
60
do
awk "BEGIN {print \"!<arch>\"; printf(\"%-16s%-12d%-6d%-6d%-8o%-10d\`\n\", \"dummy/\", $mtime + $i, 0, 0, 0644, 0)}" /dev/null > $tmp
if [ "`ar tv $tmp|awk '{print $(NF-4) \" \" $(NF-3) \" \" $(NF-2) \" \" $(NF-1)}'`" != "$mdhm $year" ]; then
break
fi
done
sec=`awk "BEGIN {printf(\"%02d\", 60 - $i)}"`
echo "$mdhm:$sec $year"
rm $tmp
#! /bin/sh
TMP=/tmp/checkdate$$
for F
do touch -r $F $TMP &&
echo x | diff -c $TMP - | sed -e 's?^*** '$TMP'?'$F'?' -e q
done
rm -f $TMP
exit 0
でも、touch -rって一般的なのかしらん…。
>> でも、touch -rって一般的なのかしらん…。
ソースとか漁ってみたら
ぬあんと 4.4BSD-Lite 以降の機能のようです。
(それ以前の touch には -c と -f しかない…)
#総合的な調査には意外と "FreeBSD Hypertext Man Pages" が便利
<URL:http://www.freebsd.org/cgi/man.cgi>
--
kabe
> でも、touch -rって一般的なのかしらん…。
http://www.FreeBSD.org/cgi/man.cgi でいろいろ調べてみると...
4.3BSD Reno
Minix 2.0
Plan 9
SunOS 4.1.3 (普通のも /usr/5bin も)
ULTRIX 4.2
Unix Seventh Edition
のマニュアルには載っていません。SunOS 4.1.3 で動かないとなると、(個人
的な感覚では)あまり「汎UNIX」的な感じはしませんね。
ついでにいえば、diff -c は
Plan 9
Unix Seventh Edition
にはないようです。Unix Seventh Edition を「汎UNIX」に含めるかどうかは
難しいところですが、含めるとなると diff -c も使えませんね。
また、Unix Seventh Edition の /usr/src/cmd で ctime などを grep してみ
たのですが、素直に秒まで出力してくれそうな物は見当たりませんでした。お
そらく、探索をせざるを得ないのではないかと思います。でも、私が書いたス
クリプトも ar の format の違いにより Unix Seventh Edition では動かない
はずではありますが。(ついでにいえばあのスクリプトは閏秒のあるあたりで
1秒ずれる問題があります。なので、実際には使わないように... ってそんな
人がいるわけないか。)
お題:
ls -l でファイルの更新時刻を取ろうとしても、
6ヶ月以上前のものは "%b %d %Y" になってしまい時刻まで取れません。
shell+汎UNIXなコマンドで完全なmtimeを得られるか?
(perlや専用バイナリ作成は反則とする)
▼直接法
・自明な解(環境依存):
NetBSD: ls -T
GNU ls: ls --full-time
・diff -c を使う
<apikru$if1$1...@caraway.media.kyoto-u.ac.jp>
diff -c ファイル名 /dev/null | head -1
ctime() のようなので出力の環境依存は少なそう
汎用には空ファイルやバイナリ対応が課題
・pr のヘッダを見る
<apikru$if1$1...@caraway.media.kyoto-u.ac.jp>
pr ファイル名 | head -3
HH:MMまで
・tar tvf の出力を使う
<3DBBC46B...@coral.ocn.ne.jp>
tar cf - file | tar tvf -
環境によっては秒までとれない
大きなファイルでは嬉しくない
→ddで切る、touch -rで小さいファイルを作って使う
・tar の出力を直接解析
<hvo3cqp...@flux.a02.aist.go.jp>
tar cf - filename|dd bs=1 skip=136 count=12
8進数の time_t を年月日時分秒に戻せるかが課題
▼間接法
・TZを秒単位でずらしてlsの出力を比較する
TZ自体をサポートしてないと…
・HH:MMまでは tar (ar) で得て、残りは秒だけずらした ar ファイルを
でっちあげてar tv の変化点を見て秒を得る
<hvon0ox...@flux.a02.aist.go.jp>
落とし穴:
・touch -r (mtimeの同じファイルを作る)は 4.4BSD-Lite以降のみ。
SunOS4とかでは使えない。
・touch -t (mtimeを偽造する)は使えない環境や秒まで指定できない環境がある
・tar tvf は秒が出るものと出ないものがある
・UNIX 7th ed. でも使える方法はないかもしれない
--
kabe