方向性未定のブログ

今は仕事の備忘録や思ったことをメモしている。

findコマンドの実用

findコマンドの基本とその実用

コマンドの基本的な文法とオプション

  • find /対象のディレクトリ -name キーワード
  • find /対象のディレクトリ -iname キーワード
    (-inameは大文字小文字を区別しない)
  • find /対象のディレクトリ -regex キーワード
    (検索ファイル名に正規表現を利用する)
  • find /対象のディレクトリ -size サイズ(ブロックサイズ)
  • find /対象のディレクトリ -type タイプ
    タイプに以下を指定することで特定のタイプのファイルを検索できる
    • b
      -typeにブロックデバイスを指定する
    • c
      -typeにキャラクタデバイスを指定する
    • d
      -typeにディレクトリを指定する
    • p
      -typeに名前付きパイプを指定する
    • f
      -typeにファイルを指定する
    • l
      -typeにシンボリックリンクを指定する
    • s
      -typeにソケットを指定する
    • D
      -typeにdoorを指定する(Solarisのみ)

実用

 特定の文字列が含まれるファイルおよびディレクトリを検索する

  • 文法
    find . -name ファイル名
  • 処理の概要
    指定したファイル名のファイルがカレントディレクトリおよびその配下に存在すればそのパスを出力する。
    ファイル名には正規表現ではなくシェルで使用できるようなワイルドカードが使える。

  • 使用例
    find . -name '*support*'
    カレントディレクトリおよびその配下に support が含まれるディレクトリおよびファイルを検索している

 findの結果を別のコマンドに渡す例

  1. grepに渡す
  2. 文法
    find . -name 検索したいファイル名 | xargs grep -al 検索したい文字列
  3. 処理概要
    findコマンドで検索した結果をさらにxargsで行単位でgrepに渡して出力を絞り込んでいる。
  4. 使用例
    find ${MY_LIB} -name '*.jar' | xargs grep -al 'org/apache/.*/InvokerTransformer'

  5. cpに渡す

  6. 文法1
    find . -name 検索したいファイル名 | xargs cp -p --target-directory=コピー先
  7. 処理概要
    findの結果を行単位でcpの第一引数に渡していることで、指定したコピー先にコピーしている。
  8. 使用例
    find . -name '*showup*' | xargs cp -p --target-directory=patchinfo
  9. 文法2 xargsの-iオプションを使用して{}を変数としてそこに引数を渡す場合
    find . -name 検索したいファイル名 | xargs -i cp -p {} /コピー先
  10. 使用例1
    find . -name '*showup*' | xargs -i cp -p {} patchinfo
  11. 使用例2{}以外の記号を使いたい場合
    find . -name '*showup*' | xargs -i% cp -p % patchinfo

  12. rmに渡す

  13. 文法
    find . -name 検索したいファイル名 | xargs -i rm {}
  14. 処理概要
    findの検索結果を行単位でrmの引数として渡すことで、指定したファイルを削除する
  15. 使用例
    find . -name '*header*' | xargs -i rm {}

 findの検索対象を指定する maxdepth と mindepth オプション

  1. maxdepth
  2. 使用例
    find . -maxdepth 1 -name '*.log'
  3. 処理概要
    指定したディレクトリ(この場合はカレント)の最上位1階層のみを対象にファイル名の末尾が.logのファイルを検索する
  4. mindepth
  5. 使用例
    find . -mindepth 1 -name '*.log'
  6. 処理概要 指定したディレクトリから最下位の1階層のみを対象にファイル名の末尾が.logのファイルを検索する

  なお、maxdepthは指定したディレクトリを起点に何階層まで検索するかを指定しており、
  mindepthは指定したディレクトリ配下の最下位のディレクトリを起点に何階層までを対象にするか指定している。

 出力結果から標準エラー出力を除く

  1. xargs grepを併用した場合に出るgrep: and: No such file or directoryなどの標準エラー出力を標準出力から除きたい場合。
  2. 使用例
    find . -name '*log' | xargs grep -ioa 2>/dev/null 'error'
  3. 処理概要
    これは単純に標準エラー出力スペシャルファイル/dev/nullにリダイレクトしている

  4. カレントディレクトリの配下にあるファイルのリストを再帰的に表示する場合

  5. 使用例
    find . -type f 2>/dev/null