UNIX/Linux の find -exec の引数にはシェルの構文を使えない.
UNIX/Linux の find コマンドの -exec アクションって,シェルを起動せずに直接コマンドを呼び出すんですね!
今まで知りませんでした (恥).
きっかけは,OKWave でのfind に関する質問.-exec の引数で,シェルの構文 `…`を使うにはどのようにエスケープすればいいのか (私も今までたまに使おうとしては挫折していた) を調べるために find のソースを少しだけ覗いてみると …あれっ,-exec でシェルを起動している気配がない!? 直接コマンドを呼び出しているみたい.それを確認するため,シェルコマンドである alias を -exec に指定して,
find . -exec alias \;
とやってみると,予想どおり次のようになった.
find: alias: そのようなファイルやディレクトリはありません
find: alias: そのようなファイルやディレクトリはありません
find: alias: そのようなファイルやディレクトリはありません
(以下略)
やっぱりシェルは呼ばれていない.だから,-execの引数にシェルの構文である `…`などを書いても実行されるわけがない.今まで (たまに) -exec でシェルの構文を使おうとして,エスケープしてみたり,引用符で囲ってみたりと悪戦苦闘してはあきらめてたけど,すべて無駄な努力だったんですね….(ToT)
-exec でシェルの構文を使いたければ,次のようにすれば可能.
find … -exec bash -c 'シェルコマンド文字列' \;
ただし,ファイルやディレクトリが1つ見つかるたびに毎回シェルが起動されるので遅くなる.さらに,シェルが起動されるたびに ~/.bashrc が実行されてしまうので,これに時間がかかると最悪.
~/.bashrc を実行しないようにするには,次のように bash の代わりにbash へのシンボリックリンクである sh を使えばよい.
find … -exec sh -c 'シェルコマンド文字列' \;
bash のマニュアルを見ると,sh -c の代わりにbash --norc -c でもいいはずなんだけど,実際やってみると ~/.bashrcが実行されてしまう.なぜ? (?_?)
シェルコマンドも使えて,かつ効率がいいのは,findで一旦シェルスクリプトを作って,それを実行することだろう.-printf を使うと,find で見つけたパス名を加工するのも簡単 (%p,%f,%h,%l など).
find … -printf "フォーマット文字列" > MyScript.sh
MyScript.sh の内容を確認し,OK ならばそれを実行する.
上記の方法でうまくいくことが確認できれば,次のようにシェルスクリプトの作成と実行を1行で書ける.
find … -printf "フォーマット文字列" | bash
リンク
データ型のアラインメントとは何か,なぜ必要なのか? (増補改訂版)
このブログでは84日ぶりの新記事です.(^^;)
過去の記事の細かい修正やホームページ
の更新は行っていましたが….
以前このブログとホームページに,何度かアラインメントに関する記事を書きました.そのせいか「アラインメント」で検索して来てくれる人が多いので,過去の記事に加筆修正して新しいページを作成しました.
「データ型のアラインメントとは何か,なぜ必要なのか? (増補改訂版)」は↓こちら .
http://www5d.biglobe.ne.jp/~noocyte/Programming/Alignment.html
関連ページ
ミドルエンディアン (PDPエンディアン,NUXI問題)
エンディアンというと,ほとんどの場合ビッグエンディアンとリトルエンディアンのどちらかだが,これら以外のエンディアンも存在する.(していた,というべきか?)
バイト列 0x01,0x02,0x03,0x04 を4バイト整数として解釈する時に, 0x01020304 となるのがビッグエンディアン, 0x04030201 となるのがリトルエンディアンだが,これら以外に 0x03040102 や 0x02010403 となるものも存在する.以前から,これらを何エンディアンと呼ぶのか疑問に思っていた.
Wikipedia の「エンディアン」の項目 によると,このようなエンディアンは DEC の PDP-11 や VAX シリーズで使われていたことから「PDP エンディアン」というらしい.エンディアンの異なるマシン間でバイナリデータを交換すると, "UNIX" という文字列が "NUXI" に化けたという故事にちなんで, "NUXI 問題 " という言葉も知られている.
「ミドルエンディアン 」という言い方も見つけた.なおこのページでは,日付の表記法もエンディアンで分類している.
- yy/mm/dd:ビッグエンディアン (日本式)
- dd/mm/yy:リトルエンディアン (ヨーロッパ式)
- mm/dd/yy:ミドルエンディアン (米国式)
私は外国式で日付を書くときに,よく dd/mm/yy か mm/dd/yy か迷うが,「米国はミドル,ヨーロッパはリトル」と覚えときゃいいんだ!
でもそれで米国の日付を yy/dd/mm などど書いちゃったらどうしよう.(^^;)
それに「ミドル」と「リトル」って発音似てるからまた間違いそうだし….
韻も踏んぢゃってるし….
私は最初,「ビッグエンディアン」と「リトルエンディアン」を逆に解釈していた.(^^;)
「ビッグエンディアン」は「大きい (big) 方で終わる (end)」という意味だと思ったからだ. (あなたもそうじゃありませんか?)
しかしこれらの言葉は,卵を丸い (大きい) 方の端 (end) から割るか,尖った (小さい) 方の端から割るかということに由来する (上記の Wikipedia「エンディアン」の項目の「語源
」を参照).
ところで同じミドルエンディアンといっても, 0x02010403 型と 0x03040102 型を区別する言葉はないんだろうか?
「NUXI エンディアン」とか「IXUN エンディアン」はどうだろう?
64ビット CPU が普及して8バイト整数がよく使われるようになると,もっと色々なミドルエンディアンが出て … こないだろうな.(笑)
ホームページに,実行時にエンディアンを判定する関数 (C言語) を掲載しました.
ソロバンの達人より速く暗算する方法?
私は十数年前,ソロバンの達人より速く暗算する方法を考案した.
ソロバンの達人は頭の中にソロバンを思い浮かべて暗算するという.
これに対し私の編み出した方法では,頭の中にソロバンではなく電卓を思い浮かべる.関数電卓 を思い浮かべれば,三角関数や指数・対数・階乗等も暗算できるはずだ.頭の中で十分速くキーを叩くよう訓練すれば,あとは電子的な速さで答えが出ることは理論的に間違いない.
ところが実際にやってみると,いつまで待っても結果が表示されない.
[=] キーを何度押してもダメ,
電源スイッチを入れ直してもダメ,
電池を交換してもダメ.
ただし1桁同士の四則演算ぐらいならば表示されることもある.
なんでだろう…?
ファイルをごみ箱に移動する方法 (Windows+C言語)
… を知りたくなって,色々調べ,実験してみた.
当然ながら,最初にすることは,ファイルをごみ箱に移動する APIを見つけることである.Visual Studio 2003.NET のオンライン・ヘルプを「ごみ箱」で検索してみると,次のことがわかった.
- ごみ箱は Windows 95 で新たに追加された機能である.
- ごみ箱は Windows 対応のシェル・アプリケーションである.
ということは,ごみ箱は Windows OS 自体の機能ではなく,シェルの機能なわけか.そこでシェル API 一覧のページ ("Shell Functions")を見てみると,SHEmptyRecycleBin() と SHQueryRecycleBin()という2つのごみ箱 API が見つかった.しかし肝心の,「ファイルをごみ箱に移動させる」API らしきものは見あたらない.Visual Studio 2003.NET のすべてのヘッダファイルを検索しても,上記の2つ以外で API 名に "Recycle" が入っているものは見つからない.
Q&A サイトで質問したり,「+"ファイルをごみ箱" +Windows +API」で Google 検索をした結果,上記の "Shell Functions" のページにあったSHFileOperation() という API がそれであることが判明した.色々実験した結果,下記のことがわかった.
- GUI アプリケーションだけでなく,コンソール・アプリケーションでも使える. コンソール・アプリであってもファイル削除確認ダイアログやエラーダイアログを表示させることができる.
- パス名を引数とする Windows API の多く (すべて?) では, ディレクトリの区切り文字として '\\' の代わりに '/' を使ったり, 両者を混在させたりすることができるが,SHFileOperation() では不可. もし使うと,ごみ箱の内容表示がおかしくなる.
- ごみ箱に移動できないファイルがある場合, なぜかそういうファイルごとに数秒間の待ち時間が発生する.
こういうことは,検索で見つけたサイトには書かれていなかった.
(そもそも (1),(2) のようなことをしようとする人はほとんどいないだろう.(^^;))
詳しくはこちら .なお,検索で見つけたサイトで示されていたサンプルコードはほとんどC以外の言語だったので,Cのサンプルコードも掲載してある.
アラインメントの大きなメモリ領域を用いて,高速かつメモリ効率の良い多数の集合を実現する.
この記事の内容は加筆修正の上,↓こちら に移動しました.
関連ページ
アラインメントの大きなメモリ領域を確保する方法
この記事の内容は加筆修正の上,↓こちら に移動しました.
関連ページ
malloc() が返すアドレスの下位数ビットは常に0って知ってます?
C言語におけるアラインメント (sizeof がアラインメントの倍数に切り上げって知ってます?)
この記事の内容は加筆修正の上,↓こちら に移動しました.
関連ページ
グレッグ・ベアの SF における情報と物理学の関係
グレッグ・ベア (Greg Bear) の SF では,情報と物理学のかかわりがキー・アイディアになっているものがある.もちろん現実の物理法則ではなく,Greg Bear が創作した架空の理論である.以下はうろ覚えのまま書いているので,記憶違いがあるかもしれない.(違っていたらお気軽に指摘してください.)
ブラッド・ミュージック (Blood Music)
この作品では,知的生命体が新しい物理法則を考えたとき,それが過去の実際の物理法則と矛盾せず,かつ宇宙がその新法則を承認した場合,その法則が現実のものとなる,という奇想天外なアイディアが使われている.つまり新しい物理法則を「発見」ではなく,「発明」することが可能なのだ.
ある遺伝子工学ハッカーが細胞を改造し,DNA がコンピュータとして動作するようにした後,ある事情で自分の身体に注射した.個々の細胞が知能を持つようになり,彼の体内で増殖する.そして彼の身体を飛び出した知的細胞(noocyte)たちは北米大陸全体に拡散して独自の文明を築く.彼等の膨大な知的活動の結果,宇宙の物理法則は大きく変わってしまう.
でも,その物理法則の変化がストーリー上大きな役割を果たしていないように思えるうえ,それによって引き起こされる新しい物理現象も驚天動地というほどのものでもなかったと記憶しているので,個人的にはその点がかなり残念.(自分のハンドル名をもらった作品に対して言うことがそれかい!)
天界の殺戮 (Anvil of Stars)
この作品は「天空の劫火 (The Forge of God) 」の続編で,次のアイディアがキーになっている.素粒子は素粒子同士が情報を交換するための秘密のチャネルを持っており,このチャネルに介入して素粒子の情報を書き替えることで遠く離れた別の素粒子に一瞬で情報を伝えたり (超光速通信),素粒子を別の素粒子に変換したりすることができる.この技術はこの作品の中で「ノアク」と呼ばれている.
ふーん,素粒子って,構造体だったんですね.← 違う
上記の素粒子変換の応用として,敵の宇宙船と乗員をまるごと,相手が気付かないうちに反物質に変換し, その宇宙船が母艦に帰還したときに物質と反物質が接触して大爆発を起こすというくだりがあった.
なお「天空の劫火」は,邪悪な異星人があらゆる他星の文明を滅ぼすために作った自己増殖型殺戮宇宙船(バーサーカー みたいなもの)と人工生物を宇宙のあちこちに派遣し,地球もそいつらにからかわれたあげく無残に破壊されてしまうという話 (むかつく~).地球の終わりの始まりを告げる,天文学的あるいは地球的規模の数々の怪現象や,破壊されていく地球の克明な描写は,読むのはつらいが読まずにはいられなかった.一部の地球人は,バーサーカーを追跡してきた,別の異星人連合(バーサーカー被害者の会 (笑)) が派遣した自動宇宙船に救出され,火星に移住する.
「天界の殺戮」は「天空の劫火」の続編で,生き残った地球人の中の有志が「バーサーカー被害者の会 (違う)」が作ってくれた自動宇宙船に乗って,邪悪な異星人の母星を見つけ出し,復讐 法の裁きを加えようとする話.彼らはバーサーカーの母星を発見し,そこに到達することができるのだろうか.そして法の裁きを加えることができるのだろうか.
ちなみに,上記の地球人有志と途中から行動を共にすることになる,異星の知的生物 (やはりバーサーカー被害者)の数学は,整数がない「無整数数学」という設定になっている.数学って,数えること (自然数) から始まるのに,無整数数学なんて想像もつかないな.クロネッカー
が聞いたら,激怒して心臓発作を起こすだろうな.(笑)
リンク
早川書房
売り上げランキング: 80,032
優秀なパニック小説
この結末なのか!?