find -maxdepth 0 が何も出力しない

find -maxdepth 0 が何も出力しない

オプションの使い方を理解しようとしていますfind -maxdepth 0

ディレクトリ構造は以下のとおりです。

--> file1
--> parent
          --> child1
                   --> file1
                   --> file2
          --> child2
                   --> file1
                   --> file2
          --> file1

ここで、find以下のようにコマンドを実行します。

find ./parent -maxdepth 0 -name "file1"
find ./ -maxdepth 0 -name "file1"
find . -maxdepth 0 -name "file1"

上記のコマンドのいずれも使用しない場合findファイル1返されます。

のマニュアルページからfind、以下の情報を確認できます。

-maxdepth 0 は、テストとアクションをコマンドライン引数にのみ適用することを意味します。

オプション付きの例をいくつか検索しました-maxdepth 0が、適切な例は見つかりませんでした。

私のfindバージョンは、

find --version
find (GNU findutils) 4.4.2

-maxdepth 0どのケースオプションが役立つかについて、ヒントを教えていただけませんか?

編集

以下のコマンドを実行すると、ファイル12 回リストされます。これは意図された動作ですか?

find . file1 -maxdepth 1 -name "file1"
./file1
file1

答え1

file1現在のディレクトリに次のものがあると仮定します。

$ find . -maxdepth 0 -name "file1"
$ find . file1 -maxdepth 0 -name "file1"
file1

さて、何を見てみましょうドキュメント状態:

-maxdepth 0 テストとアクションをコマンドライン引数にのみ適用することを意味します。

上記の最初の例では、ディレクトリのみ.コマンドラインにリストされます。.に名前がない場合はfile1、出力には何も表示されません。上記の2番目の例では、.および が file1コマンド ラインにリストされており、 とfile1一致するため-name "file1"、出力に が返されました。

-maxdepth 0言い換えれば、ないディレクトリまたはサブディレクトリを検索します。代わりに、コマンド ラインに明示的にリストされているファイルの中から一致するファイルのみを検索します。

あなたの例では、コマンド ラインにはディレクトリのみがリストされており、いずれにも名前が付けられていませんでしたfile1。したがって、出力はありません。

一般に、多くのファイルとディレクトリはコマンド ラインで名前を付けることができます。たとえば、ここではfindコマンド ラインで 9 つのファイルとディレクトリを含むコマンドを試します。

$ ls
d1  file1  file10  file2  file3  file4  file5  file6  file7
$ find d1 file1 file10 file2 file3 file4 file5 file6 file7 -maxdepth 0 -name "file1"
file1

重複するパス

考慮する:

$ find . file1 -maxdepth 0 -iname file1
file1
$ find . file1 file1 -maxdepth 0 -iname file1
file1
file1
$ find . file1 file1 -maxdepth 1 -iname file1
./file1
file1
file1

findは、コマンド ラインで指定された各パスをたどり、 のようにパスが同じファイルにつながる場合でも. file、または のようにパスが完全に重複している場合でも、一致を検索しますfile1 file1

答え2

ディレクトリ内のファイル(ディレクトリではない)を非再帰的に検索する場合は、次を使用します。

find . -maxdepth 1 -type f -name "file1"
# ./file1

-maxdepth 0 検索しません引数として指定したファイル/ディレクトリ名の間でのみ一致を試みますfind

たとえば、上記のステートメントでは、maxdepthの値を使用して、と一致しないに0一致しようとします。file1.

しかし、と組み合わせてではなくを渡す*と、bash は現在のディレクトリ内のファイルのリストに置き換え、一致するものを返します。.-maxdepth 0*

答え3

使用法:

John1024は良い例を挙げた。どうやって使用するに-maxdepth 0は、いつ使用するには:

さて、 の理由は何でしょうか-maxdepth 0?名前がわかっている場合は、コマンドを発行するだけで済みます

ls file-* 

まあ、あなたが探しているのは名前ではないかもしれません。

例:

touch file-{1..3}
echo "1" > file-1
touch -d @0 file-2

find * -maxdepth 0 -name "file-*" \( -size 1k -o -mtime +10000 \) -ls 
   669266     12 -rw-rw-r--   1 stefan   stefan          2 Mai  4 20:57 file-1
   669270      8 -rw-rw-r--   1 stefan   stefan          0 Jan  1  1970 file-2

名前パターン file-* で 3 つのファイルを作成します。次に、1 番目にコンテンツを追加し、2 番目に日付をリセットし、3 番目はそのままにします。

今、私はおそらく数千のファイルの中から 1k (1 番) またはおよそ 30 年を超える年齢のファイルを検索します。この例では、3 つのファイルの中から検索します。

しかし、find * は現在のディレクトリ内のすべてのファイルを検索するため、ディレクトリについてだけではなく、「開始点」というやや異質なマニュアル ページの専門用語が使われます。find の強力なフィルター機能により、ファイルの場所 ($PWD) がわかっているファイルを検索するという決定が下されたと思いますが、標準のシェル ツールでは他の属性を簡単にフィルターすることはできません。

関連情報