Linux - findコマンド

findコマンドの基本的な使い方を紹介します。

  • 乗車
  • 削除

ナビゲーション

まず、次のようなファイルやフォルダがあると仮定します。

$ tree
.
├── test1
│   └── 123.log
├── test1.txt
├── test2
│   └── 111.log
├── test2.txt
├── test3
│   └── 333.log
└── test3.txt

findを利用して、簡単なファイルを探すときは、次のようなコマンドを使用します。 ここで、 starting pointは移動するフォルダのパスです。

$ find [starting-point...] -name "file name"

例えば、次のようにナビゲーションパスを .に設定すると、現在のパスにあるすべてのファイルを検索します。

$ find . -name "*.log"
./test2/111.log
./test1/123.log
./test3/333.log

もし次のようにナビゲーションパスを省略すると、現在のパスに基づいて探索をします。

$ find -name "*.txt"
./test2.txt
./test1.txt
./test3.txt

次のように1つ以上のナビゲーションパスを入力することができます。 つまり、次のコマンドは、 /user/home/tmpパスからjarファイルを検索します。

$ find /user /home /tmp -name "*.jar"
/home/js/apps/idea-IC-203.5981.155/lib/jshell-frontend.jar
/home/js/sources/openjdk-jdk8u/jdk/test/tools/launcher/UnicodeTest.jar
....

Case Insensitive

findコマンドは、基本的に大文字と小文字を区別して検索します。

したがって、次のように txtTXTの検索結果が異なる場合があります。

$ find -name "*.txt"
./test2.txt
./test1.txt
./test3.txt

$ find -name "*.TXT"

もし大文字小文字を区別せずに検索したい場合は -inameオプションを使用します。

$ find -iname "*.TXT"
./test2.txt
./test1.txt
./test3.txt

最大深度와最小深度

検索パスを設定すると、そのパスの下にあるすべてのファイルを検索します。 ディレクトリの深さ(depth)を設定して、それ以下またはそれ以上のファイルは検索したくない時があります。 こういうときは、 -maxdepth-mindepthオプションを使用して範囲を指定してくれることができます。

次のような構造のディレクトリがあると仮定します。

$ tree
.
├── test1
│   ├── 123.log
│   └── test4
│       ├── 4555.log
│       └── test5
│           └── 666.log
├── test1.txt
├── test2
│   └── 111.log
├── test2.txt
├── test3
│   └── 333.log
└── test3.txt

maxdepth

次のように最大depthを2に設定すると、depthが2以下のファイルを対象に検索します。 ( depth 0は、現在のパスを意味します。)

$ find . -maxdepth 2 -name "*.log"
./test2/111.log
./test1/123.log
./test3/333.log

mindepth

次のように最小depthを3に設定すると、depthが3以上のファイルを対象に検索します。

$ find . -mindepth 3 -name "*.log"
./test1/test4/4555.log
./test1/test4/test5/666.log

エラーログの出力ない

フォルダが存在しないか権限がない場合は、次のようにエラーログが出力されます。 エラーログが非常に多く、出力なって検索結果を見ることを困難にすることがあります。

$ find /user /tmp -name "*.jar"
find: ‘/user’: No such file or directory
find: ‘/tmp/systemd-private-9f49ea226b4d4974860461c1ab2610d8-upower.service-ts25lg’: Permission denied
find: ‘/tmp/systemd-private-9f49ea226b4d4974860461c1ab2610d8-switcheroo-control.service-tftxRh’: Permission denied
find: ‘/tmp/systemd-private-9f49ea226b4d4974860461c1ab2610d8-systemd-resolved.service-QzA0Bf’: Permission denied

こういうときは、次のように 2> /dev/nullでエラーログは、端末に出力されないようにすることができます。

$ find /user /tmp -name "*.jar" 2> /dev/null

特定の種類のファイルのみ検索

特定の名前のディレクトリを検索したり、特定の名前のファイルを探したいときがあります。

こういうときは、 -typeコマンドを使用します。次のようなオプションを追加します。

  • -type d:Directoryを対象に検索を実行します
  • -type f:一般的なFileを対象に検索を実行します

上記のオプションを使用してナビゲートすると、次のような結果が出力されます。

$ ls
test1  test1.txt  test2  test2.txt  test3  test3.txt

$ find . -type d -name "test*"
./test2
./test1
./test3

$ find . -type f -name "test*"
./test2.txt
./test1.txt
./test3.txt

typeのためのより多くのオプションは、findのman pageを参照してください。

-type c
       File is of type c:
       b      block (buffered) special
       c      character (unbuffered) special
       d      directory
       p      named pipe (FIFO)
       f      regular file
       l      symbolic  link;
       s      socket
       D      door (Solaris)

削除

findで、目的のファイルを探して、そのファイルを削除したいときがあります。

findコマンドの最後に -deleteオプションを追加すると、検出されたファイルが削除されます。

$ ls
test1  test1.txt  test2  test2.txt  test3  test3.txt

$ find . -name "*.txt"
./test2.txt
./test1.txt
./test3.txt

$ find -name "*.txt" -delete

$ ls
test1  test2  test3

-execを利用して削除

-execオプションは検出されたファイルにexecを適用して、どのコマンドを実行するためのオプションです。

-exec rm {} \;を入力すると、検出されたファイルに対して削除をするようにすることができます。 (単にファイルを削除するのであれば -deleteオプションが簡単です。)

$ ls
test1  test1.txt  test2  test2.txt  test3  test3.txt

$ find . -name "*.txt"
./test2.txt
./test1.txt
./test3.txt

$ find -name "*.txt" -exec rm {} \;

$ ls
test1  test2  test3
codechachaCopyright ©2019 codechacha