No.517


【Linux】コマンド実行方法の違い【find】

findで抽出したファイルを対象にコマンドを実行する

 普段何気なくワンライナーで書いているが、習慣で書いていてきちんと理解したことがなかった。

 今回説明用にまとめたので、備忘録としてメモ。


コマンド実行の方法

  1. findコマンドの -exec オプションを使用する。
  2. xargs コマンドにパイプで渡す。

 前者は複数ファイルを同時に引数として渡すか、ひとつずつ処理するかで若干オプションが変わる。


findコマンドの -exec オプション

 ファイルをまとめて処理するパターン。

find [対象パス] findオプション -exec 実行コマンド [実行コマンドオプション] {} +

 ファイルをひとつずつ処理するパターン。

find [対象パス] findオプション -exec 実行コマンド [実行コマンドオプション] {} \\;

xargs コマンド

 ファイルをまとめて処理するパターン。

find [対象パス] findオプション | xargs 実行コマンド [実行コマンドオプション]
find [対象パス] findオプション | xargs -n 同時に実行するファイル数 実行コマンド [実行コマンドオプション]

 ファイルをひとつずつ処理するパターン。

find 対象パス [findオプション] | xargs -n1 実行コマンド [実行コマンドオプション]

補足:ファイル名に半角スペースが含まれる場合

 ファイル名に半角スペースが含まれている場合は、区切り文字と見分けがつかずに xargs コマンドでおかしいことになる。

 そういう場合は両方のコマンドで o オプションを指定して区切り文字を変更してしまえばOK。

find 対象パス [findオプション] -print0 | xargs -0 -n1 実行コマンド [実行コマンドオプション]