綾小路龍之介の素人思考

[linux] find や xargs で柔軟にコマンドを実行するには {} を使う

findやxargsは{}を使って、適当なコマンドラインを生成できる。つまり、find をうまく使えば簡易的に、各ファイルに対する処理をループでまわすことができる。さらにxargsを使うことでこのループを並列で走らせることができる。

以下はbzip2で圧縮されたファイルをxzで圧縮しなおす例。find の -exec オプションの引数は {} を見つかったファイル名に展開してくれる。

$ find ~/ -name '*.bz2' -exec sh -ec "f={}; bzip2 -v -d \${f}; xz -v -e -z -9 \${f%.bz2};" \;

上と同様の仕事をするが、xargsで2並列させる例。メモリの量によってはxz圧縮時にスワップをガリガリ使うことになるので並列数には注意。topやvmstatなどを見つつ要調整。

$ find ~/ -name '*.bz2' -print0 | xargs -0 -r -n 1 -P 2 -I{} sh -ec "f={}; bzip2 -v -d \${f}; xz -v -e -z -9 \${f%.bz2};"

処理するファイル順をソートしたい場合はfind -print0とxargs -0をsort -zパイプでつなげる。

$ find ~/ -name '*.bz2' -print0 | sort -z | xargs -0 -r -n 1 -P 2 -I{} sh -ec "f={}; bzip2 -v -d \${f}; xz -v -e -z -9 \${f%.bz2};"
$ find ~/ -name '*.bz2' -exec bzip2 -v -d {} \;
$ find ~/ -name '*.bz2' -print0 | xargs -0 -r bzip2 -v -d
$ find ~/ -name '*.bz2' -print0 | xargs -0 -r -n 1 -P 2 bzip2 -v -d
$ find ~/ -name '*.pdf' -exec xz -v -e -z -9 {} \;
$ find ~/ -name '*.bz2' -print0 | sort -z | xargs -0 -r -n 1 -P 2 -I{} sh -ec "f={}; bzip2 -v -d \${f}; xz -v -e -z -9 \${f%.bz2};"
$ find ~/ -name '*.pdf' -print0 | sort -z | xargs -0 -r -n 1 -P 10 xz -v -e -z -9

リファレンス

  1. Man page of FIND
  2. Man page of bzip2
  3. Ubuntu Manpage: xz, unxz, xzcat, lzma, unlzma, lzcat - tightly compress or expand files
  4. Cannot allocate memory xz - Google 検索
  5. Man page of XARGS
  6. Man page of BASH
  7. 複数のファイルのファイル名(拡張子)を一括で変更する。UNIX ( Linux FreeBSD )コマンドメモ|プログラムメモ
  8. Man page of SORT

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2010-07-23T15:13:44+09:00
  2. Modified: 2010-07-23T15:13:44+09:00
  3. Generated: 2017-05-06T23:09:20+09:00