findコマンドを使いこなそう
findコマンドはファイルやディレクトリを検索する時に使うUNIX/Linuxの代表的な基本コマンドです。findコマンドの便利な使い方を覚えましょう。
→ ファイルをさまざまな条件で検索するコマンド
時間指定オプション
オプション | 概要 |
-mmin | ファイルのデータが最後に修正された日時(分指定) |
-mtime | ファイルのデータが最後に修正された日時(日指定) |
-amin | ファイルのデータに最後にアクセスされた日時(分指定) |
-atime | ファイルのデータに最後にアクセスされた日時(日指定) |
-cmin | ファイルのデータとステータスが最後に修正された日時(分指定) |
-ctime | ファイルのデータとステータスが最後に修正された日時(日指定) |
現在から3日前までにファイルが最後に修正されたファイルを探す。
$ find ./ -mtime -3
過去からから3日前までにファイルが最後に修正されたファイルを探す。
$ find ./ -mtime +2
72時間前( 24 × 3 )から96時間前( 24 × 4 )にファイルが最後に修正されたファイルを探す。
※ 引数に + も – も付けない
$ find ./ -mtime 3
-execオプションを使いこなそう!!
exrcオプションを使うと、検索結果に対してコマンドを実行する事ができます。
$ find 検索元 検索ファイル名 -exec 実行するコマンド {} \;
ディレクトリ内のパーミッションが644のものを探し、パーミッションを666に変更する
$ find ./ -perm 664 -exec chmod 666 {} \;
ディレクトリ内の拡張子 .txtファイルを text.zip に圧縮追加する
$ find ./ -name “*.txt” -exec zip ./text.zip {} \;
コマンドラインを作成して実行するxargsコマンド
標準入力やファイルからリストを読み込み、コマンドラインを作成して実行するコマンドです。
手作業ならうんざりするような事も、xargsコマンドを活用するとほぼ自動化する事ができます。
$ xargs [オプション] コマンド [コマンドの引数]
オプション | 意味 |
-a ファイル | 標準入力の代わりにファイルから項目を読み込む |
-0 | 入力を空白や改行ではなくNULL文字で区切る |
-d 文字 | 入力の区切り文字を指定する。\000(8進数)または\x00(16進数)も使用可能 |
-E 終端文字列 | ファイルの終端文字列を指定する |
-I 置換文字列 | xargs実行時に指定したコマンドの引数のうち、置換文字部分を標準入力から読み込んだ名前で置き換える |
-L 行数 | 1回のコマンドラインで使用する入力行数の上限 |
-n 個数 | 1回のコマンドラインで使用する引数の上限 |
-s 文字数 | 1回分のコマンドラインの最大文字数 |
-x | 作成されたコマンドラインの長さが上限を超過していたら終了する(-I、-L使用時は自動で有効になる) |
–show-limits | コマンドラインの長さの上限を表示する(表示して直ちに終了したい場合は「xargs –show-limits -r < /dev/null」のように実行) |
-P プロセス数 | 同時に実行するプロセス数の上限を指定する(0を指定すると無制限になる。デフォルトは1) |
-r | 標準入力が空の場合は指定したコマンドを実行しない(「-r」を指定しなかった場合、入力が空でもコマンドを1回は実行する) |
-t | 実行前にコマンドラインを標準エラー出力へ出力する |
-p [文字列] | 実行前に文字列とコマンドラインをプロンプトとして表示してユーザーの入力を待つ。文字列を指定しなかった場合はコマンドラインのみをプロンプトとして表示する。なお、いずれの場合も自動的に-tを指定したことになる |
引数が多すぎますの対処方
大量にあるファイルを cp や rm など一括処理をしようとすると、「引数が多すぎます」とエラー表示され処理できない時があります。
一般的には、findコマンドとxargsコマンドを使ってエラーを回避します。
$ find ./ -name “*.png” -print0 | xargs -0 rm -rf
ファイル名の一覧を標準入力から受け取って、そのファイル一覧を任意のコマンドに引数として渡すxargsを上手に使えるようになりましょう。
大量のファイルから探したファイルをコピーする
ファイル名に、画像処理ソフト「gimp」の名前がついた PDFかDOCXのファイルを探して /home/hoge/gimp-doc ディレクトリにコピーしたい。
$ find ./ -iname "*gimp*" | grep -e pdf -e doc | grep -v sdc2 | xargs -i cp {} /home/hoge/gimp-doc/
* sdc2ディレクトリ下に doc というディレクトリがあり、 PDF or Doc ファイル以外も検索されてしまったので、grepコマンドで sdc2ディレクトリ下の検索結果は無視するようにしました。
一気にリネーム
find ./ -name "*click*.gif" | rename 's/click/クリック/'