znajdź -maxdepth 0 nie zwraca mi żadnych danych wyjściowych

17

Próbuję zrozumieć, jak korzystać z find -maxdepth 0opcji.

Mam poniższą strukturę katalogów.

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

Teraz wykonuję findpolecenie jak poniżej.

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

Bez żadnej z powyższych findkomend zwracany jest plik 1 .

Na stronie findpodręcznika użytkownika widzę poniższe informacje.

-maxdepth 0 oznacza zastosowanie testów i działań tylko do argumentów wiersza poleceń.

Szukałem przykładów z -maxdepth 0opcją i nie mogłem znaleźć żadnego odpowiedniego przykładu.

Moja findwersja to

find --version
find (GNU findutils) 4.4.2

Czy ktoś może podać mi wskazówki, w których przypadkach -maxdepth 0przydałaby się opcja?

EDYTOWAĆ

Kiedy wykonuję poniższe polecenie, plik1 pojawia się na liście dwa razy. Czy to ma tak działać?

find . file1 -maxdepth 1 -name "file1"
./file1
file1
Ramesh
źródło

Odpowiedzi:

24

Załóżmy, że mamy file1w bieżącym katalogu. Następnie:

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

Teraz spójrzmy na to, co zawiera dokumentacja:

-maxdepth 0 oznacza zastosowanie testów i działań tylko do argumentów wiersza poleceń.

W moim pierwszym przykładzie powyżej tylko katalog .jest wymieniony w wierszu poleceń. Ponieważ .nie ma nazwy file1, nic nie jest wymienione w danych wyjściowych. W moim drugim przykładzie powyżej, zarówno .i file1są wymienione w wierszu poleceń, a ponieważ file1mecze -name "file1", to wrócił na wyjściu

Innymi słowy, -maxdepth 0oznacza, że nie przeszukuj katalogów ani podkatalogów. Zamiast tego poszukaj tylko pasującego pliku spośród plików wyraźnie wymienionych w wierszu polecenia.

W twoich przykładach tylko katalogi były wymienione w linii poleceń i żaden z nich nie został nazwany file1. Dlatego nie ma wyjścia.

Zasadniczo wiele plików i katalogów można nazwać w wierszu polecenia. Na przykład tutaj wypróbowujemy findpolecenie z 11 plikami i katalogami w wierszu poleceń:

$ 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

Nakładające się ścieżki

Rozważać:

$ 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

Najwyraźniej, jak wskazuje Ramesh, findpodąży każdą ścieżką określoną w wierszu poleceń i poszuka dopasowań, nawet jeśli ścieżki prowadzą do tego samego pliku, tak jak w . fileścieżkach , a nawet jeśli ścieżki są dokładnie takie same , jak w file1 file1.

John1024
źródło
dzięki. Ale jak mogę przekazać niektóre nazwy plików w wierszu poleceń?
Ramesh
Słuszna uwaga. Zobacz moją zaktualizowaną odpowiedź. Możesz postawić tyle, ile chcesz przed pierwszym testem. Na przykład: find * -maxdepth 0 -name "file1". *Pokaże wszystkie pliki w bieżącym katalogu w linii poleceń.
John1024
1
@Ramesh Odpowiedź ponownie zaktualizowana o, mam nadzieję, lepsze wyjaśnienia i przykłady.
John1024,
dzięki jeszcze raz. Zaktualizowałem moje pytanie o więcej szczegółów z twojej ostatniej aktualizacji.
Ramesh
@Ramesh Nie mogę znaleźć tego udokumentowanego, ale widzę to samo zachowanie, co Ty: findpatrzy na każdą ścieżkę w wierszu poleceń i zgłasza dopasowania dla każdego, nawet jeśli są duplikatami.
John1024