16

I am trying to understand how to use find -maxdepth 0 option.

I have the below directory structure.

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

Now, I execute my find command as below.

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

With none of the above find commands, file1 gets returned.

From man page of find, I see the below information.

-maxdepth 0 means only apply the tests and actions to the command line arguments.

I searched for some examples with -maxdepth 0 option and couldn't find any proper example.

My find version is,

find --version
find (GNU findutils) 4.4.2

Can someone please provide me some pointers on which cases -maxdepth 0 option would be useful?

EDIT

When I execute the below command, I get the file1 getting listed twice. Is this intended to work this way?

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

Let us suppose that we have file1 in the current directory. Then:

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

Now, let's look at what the documentation states:

-maxdepth 0 means only apply the tests and actions to the command line arguments.

In my first example above, only the directory . is listed on the command line. Since . does not have the name file1, nothing is listed in the output. In my second example above, both . and file1 are listed on the command line and, because file1 matches -name "file1", it was returned in the output

In other words, -maxdepth 0 means do not search directories or subdirectories. Instead only look for a matching file among those explicitly listed on the command line.

In your examples, only directories were listed on the command line and none of them were named file1. Hence, no output.

In general, many files and directories can be named on the command line. For example, here we try a find command with 11 files and directories on the command line:

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

Overlapping paths

Consider:

$ 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

Apparently, as Ramesh points out, find will follow each path specified on the command line and look for matches even if the paths lead to the same file, as in . file or even if the paths are exact duplicates, as in file1 file1.

  • thanks. But how could I pass some file names on command line? – Ramesh Oct 16 '14 at 3:48
  • Good point. See my updated answer. You can put as many as you want before the first test. For example: find * -maxdepth 0 -name "file1". The * will list every file in the current directory on the command line. – John1024 Oct 16 '14 at 3:51
  • 1
    @Ramesh Answer updated again with, I hope, better explanation and examples. – John1024 Oct 16 '14 at 3:59
  • thanks again. I updated my question with more details from your latest update. – Ramesh Oct 16 '14 at 4:02
  • @Ramesh I cannot find it documented but I see the same behavior you do: find looks at each path on the command line and reports matches on each one even if they are duplicates. – John1024 Oct 16 '14 at 4:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.