2011-02 / 2011-02-17

前のエントリ: 前のエントリ/次のエントリにタイトル付加 [chalow]
次のエントリ: ボリューム変更ハードキーのハンドリング [Android]

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)
前のエントリ: 前のエントリ/次のエントリにタイトル付加 [chalow]
次のエントリ: ボリューム変更ハードキーのハンドリング [Android]

2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12

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