次のエントリ: ボリューム変更ハードキーのハンドリング [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)
次のエントリ: ボリューム変更ハードキーのハンドリング [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