こんにちは。よっしーです(^^)
今日は、findコマンドでカレントディレクトリを対象外にする方法についてご紹介します。
背景
とあるディレクトリ内でディレクトリだけを検索しようとして、下記のコマンドを実行します。
find . -type d
すると下記の結果になりました。
.
./dir1
./dir2
./dir3
このとき、一番上にある . (カレントディレクト) を出力したくない場面がありました。
それは、ディレクトリ内のファイルだけを出力したい場合です。
たとえば、下記のようなコマンドを実行します。
find . -type d | xargs ls
実行結果は下記のようになります。
.:
dir1 dir2 dir3 file1.txt file2.txt file3.txt
./dir1:
file1_1.txt
./dir2:
file2_1.txt
./dir3:
file3_1.txt
ほしい結果は、下記です。
./dir1:
file1_1.txt
./dir2:
file2_1.txt
./dir3:
file3_1.txt
対応策
findコマンドに -mindepth 1 オプションを指定して、実行すると下記の結果になりました。
% find . -type d -mindepth 1
./dir1
./dir2
./dir3
続いて、ファイルを出力するために下記のコマンドを実行しました。
find . -type d -mindepth 1 | xargs ls
実行結果は、下記のようになりました。
./dir1:
file1_1.txt
./dir2:
file2_1.txt
./dir3:
file3_1.txt
カレントディレクトリを除いたファイルの一覧を取得することができました。
もっとシンプルにこちらでも良いかもしれません。
% find . -type f -mindepth 2
./dir1/file1_1.txt
./dir2/file2_1.txt
./dir3/file3_1.txt
こちらの出力形式のほうがスクリプトを書く際は扱いやすい気がしますね。
解説
find . -type f -mindepth 2
このコマンドは、カレントディレクトリ(.
)以下のファイルを検索するfind
コマンドです。以下にコマンドの解説をします。
-type f
:-type
オプションは、検索するオブジェクトのタイプを指定します。f
はファイルを表します。したがって、このオプションはファイルのみを検索することを指定しています。-mindepth 2
:-mindepth
オプションは、検索を開始するディレクトリの深さの最小値を指定します。この場合、値として2
が指定されています。これは、カレントディレクトリは検索から除外し、深さ2以上のファイル以下を検索することを意味します。つまり、カレントディレクトリは対象外になります。
このコマンドを実行すると、カレントディレクトリ以下の深さ2以上のファイルが検索されます。深さ1(カレントディレクトリ直下)のファイルは検索対象外です。
例えば、以下のようなディレクトリ構造がある場合を考えます。
./
├── file1.txt (深さ1)
├── dir1/
│ ├── file2.txt (深さ2)
│ └── dir2/
│ └── file3.txt (深さ3)
└── dir3/
└── file4.txt (深さ2)
上記のコマンドを実行すると、file2.txt
とfile4.txt、file3.txt
の3つのファイルが検索されます。file1.txt
は、深さ1のファイルであるため、対象外となります。
おわりに
今日は、findコマンドでカレントディレクトリを対象外にする方法についてご紹介しました。
シェルスクリプトを書いていると痒い所に手を伸ばそうとするとどうしたら良いか分からない場面に遭遇すると思いますが、コマンドのヘルプやネットで検索してみると解決方法が見つかると思います。今は、ChatGPTでもヒントを得られるかもしれませんね。
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント