Próbuję zrozumieć, jak używać opcji find -maxdepth 0.

Mam poniższą strukturę katalogów.

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

Teraz wykonuję polecenie find jak poniżej.

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

Bez żadnego z powyższych find poleceń, file1 zostanie zwrócony.

Ze strony podręcznika podręcznika find, widzę poniższe informacje.

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

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

Mój find to,

find --version find (GNU findutils) 4.4.2 

Czy ktoś może mi podać kilka wskazówek, w jakich przypadkach opcja -maxdepth 0 byłaby przydatna ?

EDYTUJ

Kiedy wykonuję poniższe polecenie, otrzymuję file1 pojawia się dwukrotnie. Czy to ma działać w ten sposób?

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

Odpowiedź

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

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

Spójrzmy teraz na treść dokumentacji:

-maxdepth 0 oznacza onl y zastosuj testy i akcje do argumentów wiersza poleceń.

W moim pierwszym przykładzie powyżej, tylko katalog . znajduje się w wierszu poleceń. Ponieważ . nie ma nazwy file1, nic nie jest wyświetlane w wynikach. W moim drugim przykładzie powyżej zarówno ., jak i file1 są wymienione w wierszu poleceń, a ponieważ file1 pasuje do -name "file1", zostało zwrócone w wyniku

Innymi słowy, -maxdepth 0 oznacza do nie przeszukuj katalogi lub podkatalogi. Zamiast tego szukaj tylko pasującego pliku spośród tych, które zostały wyraźnie wymienione w wierszu poleceń.

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

Ogólnie rzecz biorąc, wiele plików i katalogów można nazwać w wierszu poleceń. Na przykład tutaj próbujemy wykonać polecenie find 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ładanie się ścieżki

Rozważ:

$ 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, find nastąpi każdą ścieżkę określoną w wierszu poleceń i szukaj dopasowań, nawet jeśli ścieżki prowadzą do tego samego pliku, jak w . file lub nawet jeśli ścieżki są dokładnymi duplikatami, jak w .

Komentarze

  • dziękuję. Ale jak mogę przekazać nazwy plików w wierszu poleceń?
  • Słuszna uwaga. Zobacz moją zaktualizowaną odpowiedź. Przed pierwszym testem możesz umieścić tyle, ile chcesz. Na przykład: find * -maxdepth 0 -name "file1". * wyświetli listę wszystkich plików w bieżącym katalogu w wierszu poleceń.
  • @Ramesh Odpowiedź zaktualizowana ponownie z, mam nadzieję, lepszym wyjaśnieniem i przykładami.
  • jeszcze raz dziękuję. Zaktualizowałem moje pytanie o więcej szczegółów z Twojej ostatniej aktualizacji.
  • @Ramesh Nie mogę go znaleźć udokumentowanego, ale widzę to samo zachowanie co Ty: find patrzy na każdy ścieżka w wierszu poleceń i raporty pasują do każdego z nich, nawet jeśli są duplikatami.

Odpowiedz

Jeśli chcesz nierekurencyjnie znaleźć pliki (nie katalogi) w katalogu, użyj:

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

-maxdepth 0 nie będzie wyszukiwać . Będzie próbował dopasować tylko te nazwy plików / katalogów, które podałeś jako argumenty w find. Na przykład. w powyższej instrukcji, używając wartości 0, spróbuje dopasować file1 do . który nie pasuje. Przekazanie * zamiast . spowodowałoby, że bash zastąpiłby * listą plików w bieżącym katalogu co zwróci dopasowanie.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *