find
はディレクトリ内のファイルを検索するためのコマンドです。
基本的な使い方は以下の通りです。
$ find ./
.
./01
./01/aaa.txt
./01/bbb.txt
./01/ccc.jpg
./02
./02/ddd.png
./02/eee.zip
find
と検索したいディレクトリを入力するとディレクトリ内のファイルを表示してくれます。
ワイルドカードで検索するファイル名を指定
特定のファイル名のみ検索したい場合は-name
オプションが使えます。
使い方は次のような感じです。
$ find ./ -name "*.txt" ./01/aaa.txt ./01/bbb.txt
タイプを指定
ファイル名ではなくファイルの種類(通常ファイルとかディレクトリとか)を指定して
検索したい場合は-type
オプションを使います。
$ find ./ -type f
./01/aaa.txt
./01/bbb.txt
./01/ccc.jpg
./02/ddd.png
./02/eee.zip
f
は通常ファイルという意味です。ディレクトリを検索したい場合はd
と入力します。
検索したファイルに対してコマンドを実行
検索したファイルに対してコマンドを実行したい場合は-exec
オプションを使います。
使い方は次のような感じです。
$ find ./ -type f -exec du -h {} \; 4 ./01/aaa.txt 4 ./01/bbb.txt 12 ./01/ccc.jpg 160 ./02/ddd.png 156 ./02/eee.zip
-exec
に続いて実行したいコマンドを入力します。
最後は\;
と入力してください。
{}
は検索したファイル名に置き換えて実行されますので、実際には
du -h ./01/aaa.txt
du -h ./01/bbb.txt
のようなコマンドが実行されていることになります。
※du
はファイルサイズを調べるコマンドです。
-exec
でパイプ|
を使いたい場合
シェル(shell)の基本的な機能としてパイプ(pipe)というものがあります。
これを使ってコマンドの実行結果を次のコマンドに渡すことができます。
$ du -h ./01/aaa.txt | cut -c -1
4
こんな感じで使って、1つ目のコマンド「du -h ./01/aaa.txt
」の実行結果「4 ./01/aaa.txt
」を2つ目のコマンド「cut -c -1
」に渡し、最終的に4
という結果を得るという風に使います。
※cut -c -1
は入力内容の最初の1文字を出力するコマンドです。
パイプはシェルを使う時に便利な機能なのですが、残念ながらfind
コマンドでは使うことができません。ですが、少し工夫することで使えるようになります。
$ find ./ -type f -exec sh -c "du {} | cut -c -1" \;
4
4
1
1
1
-exec
に直接実行したいコマンドを指定する代わりにsh -c
を使うという方法です。
-c
は指定された文字列をコマンドとして実行するシェル(sh)のオプションですが、これを使ってパイプが使えないという制限を回避できます。
※bash
とかzsh
などでも-c
オプションがあるので同じ方法が使えます。
-exec
でバッククォート`
を使いたい場合
これもシェルの基本的な機能なのですが、バッククォートというものがあります。
$ a=`dirname ./01/aaa.txt`
$ b=`basename ./01/aaa.txt`
こんな感じで使うとコマンドの実行結果を変数に保存することができます。
※dirname
はディレクトリ部分、basename
はファイル名部分の文字列を表示するコマンドです。
$ echo $a - $b
./01 - aaa.txt
残念ながらこれもfind
では使えません。しかも、バッククォート内で{}
が使えないのでsh -c
でコマンドを実行するという方法も使えません。
ですが、こちらもちょっとした工夫で目的のコマンドを実行することができます。
$ find ./ -type f | while read line; do > a=`dirname $line` && b=`basename $line` && echo $a - $b > done ./01 - aaa.txt ./01 - bbb.txt ./01 - ccc.jpg ./02 - ddd.png ./02 - eee.zip
注意点ですが、パイプ以降の部分はfind
コマンドではないので{}
は使えません。$line
で1行ごとの出力結果を得られるので、それを使う形になります。
※パイプを使わずfind
の実行結果をテキストファイルに保存しても同じことができます。