1. 概要

Linuxでは、grepコマンドを使用してファイル内のテキストを検索することがよくあります。 grep コマンドは、検索をより効果的にするいくつかの追加機能を提供します。 そのような機能の1つは、ディレクトリ階層を繰り返しながらディレクトリを除外することです。

このチュートリアルでは、これを実現するためのさまざまな方法について説明します。

2. 単一のディレクトリを除外する

例として使用するファイルとディレクトリのセットを作成しましょう。

$ mkdir dir1 dir2 dir3 logs nginx-logs
$ echo "This is sample text from dir1/file1.txt file" > dir1/file1.txt
$ echo "This is sample text from dir2/file2.txt file" > dir2/file2.txt
$ echo "This is sample text from dir3/file3.txt file" > dir3/file3.txt
$ echo "This is sample text from logs/service.log file" > logs/service.log
$ echo "This is sample text from nginx-logs/nginx.log file" > nginx-logs/nginx.log

作成したディレクトリツリーを見てみましょう。

$ tree -h .
.
├── [4.0K]  dir1
│   └── [  45]  file1.txt
├── [4.0K]  dir2
│   └── [  45]  file2.txt
├── [4.0K]  dir3
│   └── [  45]  file3.txt
├── [4.0K]  logs
│   └── [  47]  service.log
└── [4.0K]  nginx-logs
    └── [  51]  nginx.log

5 directories, 5 files

grepコマンドの–exclude-dir オプションを使用して、ディレクトリを除外できます。

$ grep -R "sample" --exclude-dir=dir1
logs/service.log:This is sample text from logs/service.log file
dir3/file3.txt:This is sample text from dir3/file3.txt file
dir2/file2.txt:This is sample text from dir2/file2.txt file
nginx-logs/nginx.log:This is sample text from nginx-logs/nginx.log file

上記の例では、 grep コマンドは、dir1を除くすべてのディレクトリでパターンを検索します。

3. 複数のディレクトリを除外する

–exclude-dirオプションを複数回使用して、複数のディレクトリを除外できます。

$ grep -R "sample" --exclude-dir=dir1 --exclude-dir=dir2 --exclude-dir=dir3
logs/service.log:This is sample text from logs/service.log file
nginx-logs/nginx.log:This is sample text from nginx-logs/nginx.log file

上記の例では、 grep コマンドは、 dir 1、 dir2 、およびdir3を除くすべてのディレクトリでパターンを検索します。

同じ結果を達成するための代替構文があります。 中括弧でディレクトリのリストを提供できます。

$ grep -R "sample" --exclude-dir={dir1,dir2,dir3}
logs/service.log:This is sample text from logs/service.log file
nginx-logs/nginx.log:This is sample text from nginx-logs/nginx.log file

カンマの前後にスペースを入れないでください。

4. パターンマッチングを使用してディレクトリを除外する

除外するディレクトリが多数ある場合は、パターンマッチングを使用すると便利な場合があります。 grep コマンドは、ワイルドカードを介してディレクトリを除外するパターンマッチングをサポートしています。

  • 前の文字が0回または1回出現することを示します
  • * は、前の文字が0回以上出現することを示します
  • \はワイルドカードを引用するために使用されます

パターンdir?を使用して、 dir1 dir2、、およびdir3ディレクトリを除外しましょう。

$ grep -R "sample" --exclude-dir=dir?
logs/service.log:This is sample text from logs/service.log file
nginx-logs/nginx.log:This is sample text from nginx-logs/nginx.log file

logs \*および\* logs パターンを使用して、名前がlogsで始まるまたは終わるディレクトリを除外してみましょう。

$ grep -R "sample" --exclude-dir={logs\*,\*logs}
dir1/file1.txt:This is sample text from dir1/file1.txt file
dir3/file3.txt:This is sample text from dir3/file3.txt file
dir2/file2.txt:This is sample text from dir2/file2.txt file

5. 結論

このチュートリアルでは、ディレクトリ階層を繰り返しながらディレクトリを除外する3つの実用的な方法について説明しました。 このチュートリアルに示されているコマンドは、Linuxシステムでの作業中に日常生活で使用できます。