find|xargsでスペース込みのパスが有る場合
2011-02-17-1 / カテゴリ: [linux][command] / [permlink]

$ find path [opt] -print0 | xargs -0 command
でGo

これで、findの結果が\0区切りになり、xargsのデリミタの扱いが\0になる。
http://linuxjm.sourceforge.jp/html/GNU_findutils/man1/xargs.1.html

例: "a b.txt" がある場合
zaki@salva% find . -name "*txt"                                    [~/tmp/path]
./a b.txt
./a.txt
./b.txt
./sub/a b.txt
./sub/a.txt
./sub/b.txt
こんなディレクトリ構成の場合("a b.txt"がある)
zaki@salva% find . -name "*txt" | xargs file                       [~/tmp/path]
./a:         ERROR: cannot open `./a' (No such file or directory)
b.txt:       empty
./a.txt:     empty
./b.txt:     empty
./sub/a:     ERROR: cannot open `./sub/a' (No such file or directory)
b.txt:       empty
./sub/a.txt: empty
./sub/b.txt: empty
"a"とか"b.txt"なんかねーよといわれる。

これは、findの結果が改行区切りで出力されるためで、更にxargsが改行とスペースを区切りとみなしているため。
zaki@salva% find . -name "*txt" | od -c                            [~/tmp/path]
0000000   .   /   a       b   .   t   x   t  \n   .   /   a   .   t   x
0000020   t  \n   .   /   b   .   t   x   t  \n   .   /   s   u   b   /
0000040   a       b   .   t   x   t  \n   .   /   s   u   b   /   a   .
0000060   t   x   t  \n   .   /   s   u   b   /   b   .   t   x   t  \n
0000100
んで、-print0を付加してやると
zaki@salva% find . -name "*txt" -print0 | od -c                    [~/tmp/path]
0000000   .   /   a       b   .   t   x   t  \0   .   /   a   .   t   x
0000020   t  \0   .   /   b   .   t   x   t  \0   .   /   s   u   b   /
0000040   a       b   .   t   x   t  \0   .   /   s   u   b   /   a   .
0000060   t   x   t  \0   .   /   s   u   b   /   b   .   t   x   t  \0
0000100
区切りが\0に変わる。

で、xargs -0 で本来「スペース/改行区切りで」ファイル名を拾う動作が、\0区切りになる、と。
zaki@salva% find . -name "*txt" -print0 | xargs -0 file            [~/tmp/path]
./a b.txt:     empty
./a.txt:       empty
./b.txt:       empty
./sub/a b.txt: empty
./sub/a.txt:   empty
./sub/b.txt:   empty

そもそもスペース込みのファイル名やディレクトリ名をつけるな、という話。

xargs(1)
find(1)

エミュレータでパケットキャプチャ
2011-02-01-1 / カテゴリ: [command][network][Android] / [permlink]

ホストPCやサーバ側でキャプチャできない環境の場合、エミュ自身の内蔵tcpdumpでキャプチャ可能。
多分使う機会はホストがwindowsで、ホスト自身で動かしてるサーバへアクセスする際のキャプチャくらいかね。(リモートならEthereal使えば良し)

基本は
# tcpdump -s 0 -X port 80
など。

-s 0 は、未指定だとデフォルトキャプチャサイズが96bytesになり、キャプチャ漏れが発生するので、適当に指定すればよし。0指定だと65535byteになる。
-X は指定なしだと訓練されていないと読めない(笑)

port 80 の部分は、キャプチャのフィルタ条件。指定がないとidleでも結構パケットが飛んでいるので、見たいパケットが見えなくなる。
"port 80" で 80/TCP の全てのパケット
"host jp-z.jp" で、jp-z.jp との全パケット
"port 80 and host jp-z.jp" で↑のand

「コマンドラインじゃわからん!wiershark/etherealで見たいんだ!」な場合は
# tcpdump -s 0 -w /mnt/sdcard/capture.cap port 80
でキャプチャ結果をファイルへ出力できるので、DDMSのファイルエクスプローラで取り出して見ればOK
あとはググッてねん。

ちなみに停止の^Cで、シェルごとなぜか抜けてしまうので、PCのシェル(コマンドライン)上で
% adb -s emulator-5554 shell tcpdump -s 0 -w /mnt/sdcard/capture.cap port 80 and host jp-z.jp
とした方が良いかも知れん。


実機だとpermission deniedになる。うーん、rootな端末もあった方が良いのかも。

tarオプション/書庫追加(追記)
2011-01-23-1 / カテゴリ: [linux][command] / [permlink]

% tar xf foobar.tar.gz
で展開できるんだな。
いまだに xzvf って叩いてしまうよ・・・

ついでに[2004-08-06-2]の書庫にファイル追加をちょっと修正。

強制make
2007-03-13-1 / カテゴリ: [programming][command] / [permlink]

% make -B
いわゆるリビルド
JMのManpage of MAKEにはないから、新しいオプションなのかな。

GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i686-pc-cygwin

暗号化zipファイル作成
2006-12-27-1 / カテゴリ: [linux][command] / [permlink]

普通のzip生成
% zip files.zip file1 file2 ...

ディレクトリ丸ごと再帰的に
% zip files.zip -r ./dir/

再帰圧縮をパス尽きzipに
% zip -e files.zip -r ./dir/
Enter password: <- パスワードの入力(非表示)
Verify password: <- パスワードの確認(非表示)

バッチ的に引数にパスワードを渡したいとき (非対話モード)
% zip -P password files.zip -r ./dir/

-P について man zip を超意訳
-P password は安全じゃない。大抵の環境でコマンドラインの引数がほかのユーザに丸見えだし、一人で使うマシンでも肩越しにディスプレイを見られたらアウト。対話的に聞いてくるやつなら見えないのでそっちを使おう。

GNUのC++コンパイラのコマンド名はg++
2006-12-21-1 / カテゴリ: [command][c++] / [permlink]

やべー、ずっと gcc 使ってエラーになって不思議がってた。

マッチ回数の出力
2006-11-30-1 / カテゴリ: [linux][command][grep] / [permlink]

% grep -c String *.cpp
-c 無しをパイプで wc -l に突っ込むのと違うのは、ファイルごとの集計をしてくれること。

String の使用頻度順にソート
% grep -wc String *.cpp | sort -nt ':' +1

あぁ、基本技だなぁ…

tar + gz + gpg で暗号化バックアップ
2006-09-28-1 / カテゴリ: [暗号][shell][command] / [permlink]

共用ファイルサーバへのファイルバックアップ、とか。
PASS=パスフレーズ
SRC=バックアップ元
DST=バックアップ先
% echo ${PASS} | { tar zcvf - ${SRC} | gpg --batch -o {DST} --passphrase-fd 3 -c; } 3>&0

--batch で対話モードのオフ
-o FILENAME で出力ファイル名の指定
--passphrase-fd N でパスフレーズの入力ディスクリプタ指定

1年以上シェルスクリプトでコード書いてないから書式が…(汗)

参考:Symmetric key encryption by GnuPG

ネットワークを使用中のプログラム一覧
2006-03-14-2 / カテゴリ: [win][command] / [permlink]

-b 付きで netstat 実行
> netstat -b

Active Connections

  Proto  Local Address          Foreign Address        State           PID
  TCP    MOZZARELLA:2542        localhost:2543         ESTABLISHED     4076
  [firefox.exe]

  TCP    MOZZARELLA:2543        localhost:2542         ESTABLISHED     4076
  [firefox.exe]

  TCP    MOZZARELLA:2869        localhost:3920         ESTABLISHED     1288
  C:\WINDOWS\System32\httpapi.dll
  c:\windows\system32\upnphost.dll
  C:\WINDOWS\system32\RPCRT4.dll
  C:\WINDOWS\system32\ole32.dll
  [svchost.exe]

diff オプション再帰編
2006-03-08-2 / カテゴリ: [linux][unix][command] / [permlink]

-q: 差分の有無のみ出力
まぁ、基本オプションだろうけど。
$ diff -rq chalow-1.0rc4/ chalow-1.0rc6
ファイルchalow-1.0rc4/ChangeLogとchalow-1.0rc6/ChangeLogは違います
ファイルchalow-1.0rc4/ChangeLogReader.pmとchalow-1.0rc6/ChangeLogReader.pmは違います
ファイルchalow-1.0rc4/READMEとchalow-1.0rc6/READMEは違います
ファイルchalow-1.0rc4/chalowとchalow-1.0rc6/chalowは違います
ファイルchalow-1.0rc4/cl.confとchalow-1.0rc6/cl.confは違います
ファイルchalow-1.0rc4/clsearch.cgiとchalow-1.0rc6/clsearch.cgiは違います
chalow-1.0rc6/confだけに発見: utf8
chalow-1.0rc4/conf/ytoだけに発見: cl-yto.conf
chalow-1.0rc6/conf/ytoだけに発見: cl.conf
chalow-1.0rc6/conf/ytoだけに発見: debug.css
ファイルchalow-1.0rc4/conf/yto/diary.cssとchalow-1.0rc6/conf/yto/diary.cssは違います

-x PATTERN: PATTERN(ファイルグロブ)に一致するファイルを除外
$ diff -x README -x "Change*" -ru chalow-1.0rc4/ chalow-1.0rc6/
--- chalow-1.0rc4/chalow        2004-12-24 21:09:50.000000000 +0900
+++ chalow-1.0rc6/chalow        2005-08-21 14:35:31.000000000 +0900
@@ -1,5 +1,5 @@
-#!/usr/bin/env perl
-# $Id: chalow,v 1.95 2004/12/24 12:09:50 yto Exp $
+#!/usr/bin/perl
:
:
chalow の新しい(つっても半年以上前だけど)バージョンに「続きを見る」機能があるらしーけど、割とコードをいじくり回してるのでうまくマージしないと…

perl のパスまで変わってるのかよ^^;

ルーティングの表示・変更
2006-03-02-1 / カテゴリ: [win][command][network] / [permlink]

表示
> route print
または
> netstat -r
:
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0      192.168.1.1   192.168.1.100       20
        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1       1
      192.168.1.0    255.255.255.0    192.168.1.100   192.168.1.100       20
    192.168.1.100  255.255.255.255        127.0.0.1       127.0.0.1       20
    192.168.1.255  255.255.255.255    192.168.1.100   192.168.1.100       20
        224.0.0.0        240.0.0.0    192.168.1.100   192.168.1.100       20
  255.255.255.255  255.255.255.255    192.168.1.100   192.168.1.100       1
  255.255.255.255  255.255.255.255    192.168.1.100               3       1
Default Gateway:       192.168.1.1
===========================================================================
:

Destination: 172.26.0.0 / Netmask: 255.255.0.0 の Gateway を 192.168.1.1 として追加
> route add 172.26.0.0 mask 255.255.0.0 192.168.1.1

↑の Gateway を 10.0.0.1 に変更
> route change 172.26.0.0 mask 255.255.0.0 10.0.0.1

↑の設定を削除
> route delete 172.26.0.0

add と change は実際に経路がないと設定できないっぽい(XP SP2)

NetBIOS名の名前解決
2005-12-25-2 / カテゴリ: [win][command][network] / [permlink]

[2004-06-18]
って,中途半端にしか書いてない...(しかもリンク切れ)

http://www.atmarkit.co.jp/fwin2k/win2ktips/378findip/findip.html
> nbtstat -a cheddar
> nbtstat -c
で Go


(2006-03-03 追記)
オプション足らず…

dnsキャッシュのクリア
2005-12-25-1 / カテゴリ: [win][command][network] / [permlink]

書いてなかったのでメモ
> ipconfig /registerdns
DHCP の /renew も同時に行う.

N回マッチしたら終了
2005-12-22-3 / カテゴリ: [linux][command][grep] / [permlink]

$ grep -m N pattern

Fromアドレスの収5集
$ find ~/Maildir -type f | xargs grep -m 1 '^From: ' | sed 's/.*From: \(.*\)/\1/' | sort | uniq
ん、sed は 's/.*From: //' の方が良いかな?

procmailrc でメールの保存先
2005-12-21-1 / カテゴリ: [linux][メール][command] / [permlink]

/. で終わる ... MH 形式
/ で終わる ... Maildir 形式

.procmailrc によるフォルダ振り分けは、あらかじめ対象フォルダを準備しておかないと NG
Maildir の場合は、配下の new/cur/tmp は勝手にできる。

CRを消す
2005-11-06-1 / カテゴリ: [command][perl] / [permlink]

nkf がなかったので
$ perl -pe 's/\r\n/\n/' file

パッケージ管理あれこれ
2005-11-05-1 / カテゴリ: [cygwin][debian][redhat][Solaris][command] / [permlink]

すぐ忘れるのでメモ

インストール済みのパッケージ一覧出力
# dpkg -l      (debian)
# rpm -qa      (redhat)
# cygcheck -cd (cygwin)
# pkginfo      (Solaris)

インストール済みのパッケージ foo に含まれるファイル一覧
# dpkg -L foo     (debian)
# rpm -ql foo     (redhat)
# cygcheck -l foo (cygwin)
# pkgchk -vn foo  (Solaris)

ファイル /foo/bar をインストールしたパッケージ
# dpkg -S /foo/bar     (debian)
# rpm -qf /foo/bar     (redhat)
# cygcheck -f /foo/bar (cygwin)
# pkgchk -lp /foo/bar  (Solaris)

solaris はかなりアヤシイ.

fetchmailエラー cannot get a range of message sizes
2005-08-20-4 / カテゴリ: [linux][command][POP3][メール] / [permlink]

ここ数日、メールが全く届かないからおかしいなぁと思っていたら(個人メールはなくても、ML と spam は届くはず...orz)、fetchmail がエラー吐いていた。(というか全然気づかんかった...)
$ fetchmail 
fetchmail: 185 通のメッセージがアカウント zaki@mail.example.org , サーバ mail.example.org 宛に届いています。 (933330 バイト)
fetchmail: cannot get a range of message sizes (1-100).
fetchmail: クライアント/サーバプロトコルエラーが mail.example.org よりメールを 受信している最中に発生しました。
fetchmail: Query status=4 (PROTOCOL)
んぎゃぁ。

で、調べてみると、
http://lists.ccil.org/pipermail/fetchmail-friends/2003-October/008061.html
> This is the log:
fetchmail: cannot get a range of message sizes (1-14).

i have added fetchsizelimit 0 for this account and now it works (wasn't
necessary with 6.2.4)
新しい Bug なのね。

というか
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=323027
これかなぁ。

まぁ、
$ fetchmail --version
:
  Fetch message size limit is 100 (--fetchsizelimit 100).
:
と(そんな設定はしていないのに)なってるんで、.fetchmailrc に
fetchsizelimit 0
追加しておけば、とりあえず fetch できた。


数日前に、友人から結婚します(未来形)のご報告メールが...

tar アーカイブから、部分的にファイルを取り出す。
2005-08-08-2 / カテゴリ: [linux][command] / [permlink]

$ tar tzvf tmp.tar.gz
tmp/telnet/terminal.c
tmp/telnet/tn3270.c
tmp/telnet/types.h
tmp/telnet/utilities.c
tmp/test.cat
tmp/test.grep
tmp/unison.test/
tmp/unison.test/dira/
tmp/unison.test/dirb/
tmp/zzz/
tmp/zzz/1.0.6/
tmp/zzz/1.0.6/zzz.txt
tmp/zzz/1.0.7/
tmp/zzz/1.0.7/zzz.txt
tmp/zzz/today/
つー、状態で

$ tar zxvf tmp.tar.gz tmp/zzz
tmp/zzz/
tmp/zzz/1.0.6/
tmp/zzz/1.0.6/zzz.txt
tmp/zzz/1.0.7/
tmp/zzz/1.0.7/zzz.txt
tmp/zzz/today/

ls をリダイレクトしたときに、1行複数項目表示
2005-08-08-1 / カテゴリ: [unix][command] / [permlink]

$ ls -C | more

オプションなしで ls をリダイレクト・パイプしたときは1行1エントリになる(つか、これがデフォルトみたい)。
       出力は標準出力に対して行われ、 -C オプションで複数列出力が要求されな い
       限 り、1 行に 1 エントリである。しかし、端末に対する出力では、出力が 1
       列または複数列のどちらになるかが定められていない。オプション -1 と -C
       は、それぞれ 1 列出力と複数列出力を強制させるために使用される。
man ls より
カテゴリ: command / 1 2 3 4 5 6 次ページ

最終更新時間: 2013-05-02 16:12