find
find コマンドは、指定したディレクトリ内でファイルやディレクトリを検索するために使用します。
さまざまなオプションを使って検索結果を絞り込むことができます。引数より前にある文字列はすべて検索対象のディレクトリ名と見なされます。引数を何も指定せずに実行すると、find コマンドは現在のディレクトリ内のサブディレクトリとファイルを検索し、見つかったものをすべて表示します。
構文
find [-H] [-L] [-P] [-Olevel] [-D debugopts] [path...] [expression]
オプション
path は検索するディレクトリパスで、ディレクトリ名またはファイル名を指定できます。スペースで区切って複数のパスを指定することもでき、パスを指定しない場合はデフォルトで現在のディレクトリになります。
expression は省略可能な引数で、ファイル名、ファイルタイプ、ファイルサイズなどの検索条件を指定します。
expression で使用できるオプションは 20~30 種類ありますが、以下によく使うものを示します:
-name pattern:ファイル名で検索します。ワイルドカード*と?を使用できます。-iname pattern:-nameと同様ですが、大文字と小文字を区別しません;-type type:ファイルタイプで検索します。f(通常ファイル)、d(ディレクトリ)、l(シンボリックリンク)などを指定できます。-size [+-]size[cwbkMG]:ファイルサイズで検索します。+または-で指定サイズより大きい・小さいを表し、単位はc(バイト)、w(ワード)、b(ブロック)、k(KB)、M(MB)、G(GB)を使用できます。-mtime days:更新日時で検索します。+または-で指定日数より前・以内を表し、days は日数を表す整数です。-user username:ファイルの所有者で検索します。-group groupname:ファイルの所属グループで検索します。
find コマンドで時間に関するパラメータは以下のとおりです:
-amin n:n 分以内にアクセスされたファイルを検索します。-atime n:n*24 時間以内にアクセスされたファイルを検索します。-cmin n:n 分以内に状態(権限など)が変更されたファイルを検索します。-ctime n:n*24 時間以内に状態(権限など)が変更されたファイルを検索します。-mmin n:n 分以内に更新されたファイルを検索します。-mtime n:n*24 時間以内に更新されたファイルを検索します。
これらのパラメータでは、n に正の数、負の数、ゼロを指定できます。正の数は指定した時間より前に更新またはアクセスされたファイル、負の数は指定した時間以内に更新またはアクセスされたファイル、ゼロは現在の時点で更新またはアクセスされたファイルを表します。
例:-mtime 0 は今日更新されたファイル、-mtime -7 は過去 1 週間以内に更新されたファイルを検索します。
時間の n パラメータについて:
- +n:n 日前より古いファイルやディレクトリを検索します。
- -n:n 日以内に属性が変更されたファイルやディレクトリを検索します。
- n:n 日前(その日)に属性が変更されたファイルやディレクトリを検索します。
よく使うコマンド
現在のディレクトリとサブディレクトリ内のすべてのファイルとフォルダを一覧表示
find .
現在のディレクトリで file.txt という名前のファイルを検索
find . -name file.txt
現在のディレクトリとそのサブディレクトリにある拡張子 .c のファイルをすべて一覧表示
find . -name "*.c"
同上(大文字と小文字を区別しない)
find . -iname "*.c"
現在のディレクトリとそのサブディレクトリ内のすべてのファイルを一覧表示
find . -type f
/home ディレクトリ内で 1MB より大きいファイルを検索
find . -size +1M
10KB 未満のファイルを検索
find . -type f -size -10k
10KB ちょうどのファイルを検索
find . -type f -size 10k
- ファイルサイズの単位:
- b —— ブロック(512 バイト)
- c —— バイト
- w —— ワード(2 バイト)
- k —— キロバイト
- M —— メガバイト
- G —— ギガバイト
/var/log ディレクトリ内で 7 日前に更新されたファイルを検索
find /var/log -mtime +7
現在のディレクトリとそのサブディレクトリで、ちょうど 20 日前に更新されたファイルをすべて一覧表示
find . -ctime 20
現在のディレクトリとそのサブディレクトリで、20 日前以前に更新されたファイルをすべて一覧表示
find . -ctime +20
現在のディレクトリとそのサブディレクトリで、直近 20 日以内に更新されたファイルをすべて一覧表示
find . -ctime 20
/var/log ディレクトリ内で変更日時が 7 日より前の通常ファイルを検索し、削除前に確認する
find /var/log -type f -mtime +7 -ok rm {} \;
現在のディレクトリで、所有者が読み書き権限を持ち、グループと他のユーザーが読み取り権限を持つファイルを検索
find . -type f -perm 644 -exec ls -l {} \;
システム内のサイズが 0 の通常ファイルをすべて検索し、フルパスを一覧表示
find / -type f -size 0 -exec ls -l {} \;
現在のディレクトリとサブディレクトリで、.txt と .pdf で終わるすべてのファイルを検索
find . \( -name "*.txt" -o -name "*.pdf" \)
或
find . -name "*.txt" -o -name "*.pdf"
ファイルパスまたはファイルに一致させる
find /usr/ -path "*local*"
正規表現でファイルパスに一致させる
find . -regex ".*\(\.txt\|\.pdf\)$"
同上(大文字と小文字を区別しない)
find . -iregex ".*\(\.txt\|\.pdf\)$"
否定条件:/home 下で .txt で終わらないファイルを検索
find /home ! -name "*.txt"
ファイルタイプで検索
find . -type 类型参数
- タイプパラメータ一覧:
- f 通常ファイル
- l シンボリックリンク
- d ディレクトリ
- c キャラクタデバイス
- b ブロックデバイス
- s ソケット
- p Fifo
ディレクトリの深さを指定して検索(下位への最大深さを 3 に制限)
find . -maxdepth 3 -type f
現在のディレクトリから少なくとも 2 階層下にあるすべてのファイルを検索
find . -mindepth 2 -type f
現在のディレクトリ内のすべての.logファイルを削除
find . -type f -name "*.log" -delete
現在のディレクトリで権限が 777 のファイルを検索
find . -type f -perm 777
現在のディレクトリで権限が 644 ではない.confファイルを検索
find . -type f -name "*.conf" ! -perm 644
現在のディレクトリでユーザーsunriseが所有するすべてのファイルを検索
find . -type f -user sunrise
現在のディレクトリでグループsunriseが所有するすべてのファイルを検索
find . -type f -group sunrise
現在のディレクトリでrootが所有するすべてのファイルを検索し、所有者をユーザーsunriseに変更
find . -type f -user root -exec chown sunrise {} \;
上の例で、{} は -exec オプションと組み合わせてすべてのファイルに一致させるために使用され、対応するファイル名に置き換えられます。
homeディレクトリ内のすべての.txtファイルを検索して削除
find $HOME/. -name "*.txt" -ok rm {} \;
上の例で、-ok は -exec と同じ動作をしますが、該当の操作を実行するかどうかを確認するプロンプトが表示されます。
現在のディレクトリ内のすべての.txtファイルを検索し、連結してall.txtファイルに書き込む
find . -type f -name "*.txt" -exec cat {} \;> /all.txt
現在のディレクトリまたはサブディレクトリ内のすべての .txt ファイルを検索し、サブディレクトリ sk はスキップする
find . -path "./sk" -prune -o -name "*.txt" -print
⚠️ ./sk を ./sk/ と書くと効果がありません。
2 つのディレクトリを除外
find . \( -path ./sk -o -path ./st \) -prune -o -name "*.txt" -print
⚠️ 相対パスで書く場合は必ず./を付けてください
サイズが 0 のすべてのファイルを一覧表示
find . -empty
コードの行数を集計
find . -name "*.c"|xargs cat|grep -v ^$|wc -l # 代码行数统计, 排除空行
その他の例
find ~ -name '*jpg' # 主目录中找到所有的 jpg 文件。 -name 参数允许你将结果限制为与给定模式匹配的文件。
find ~ -iname '*jpg' # -iname 就像 -name,但是不区分大小写
find ~ ( -iname 'jpeg' -o -iname 'jpg' ) # 一些图片可能是 .jpeg 扩展名。幸运的是,我们可以将模式用“或”(表示为 -o)来组合。
find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f # 如果你有一些以 jpg 结尾的目录呢? (为什么你要命名一个 bucketofjpg 而不是 pictures 的目录就超出了本文的范围。)我们使用 -type 参数修改我们的命令来查找文件。
find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type d # 也许你想找到那些命名奇怪的目录,以便稍后重命名它们
ドキュメント