Snažím se pochopit, jak použít možnost find -maxdepth 0.

Mám níže uvedenou adresářovou strukturu.

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

Nyní spustím příkaz find, jak je uvedeno níže.

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

Bez žádného z výše uvedených find příkazů file1 se vrátí.

Na stránce manuálu find vidím níže uvedené informace.

-maxdepth 0 znamená použít testy a akce pouze na argumenty příkazového řádku.

Hledal jsem několik příkladů s možností -maxdepth 0 a nemohl jsem najít žádný vhodný příklad.

Můj find

find --version find (GNU findutils) 4.4.2 

Může mi někdo poskytnout nějaké ukazatele, na které případy by byla užitečná možnost -maxdepth 0 ?

EDIT

Když spustím níže uvedený příkaz, zobrazí se file1 získání seznamu dvakrát. Je to zamýšleno takhle?

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

Odpověď

Předpokládejme, že máme file1 v aktuálním adresáři. :

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

Nyní se podívejme na to, co uvádí dokumentace:

-maxdepth 0 znamená pouze y aplikovat testy a akce na argumenty příkazového řádku.

V mém prvním příkladu výše, pouze adresář . je uveden na příkazovém řádku. Protože . nemá název file1, není ve výstupu nic uvedeno. V mém druhém příkladu výše jsou . a file1 uvedeny na příkazovém řádku a protože file1 odpovídá -name "file1", bylo vráceno ve výstupu

Jinými slovy, -maxdepth 0 znamená do ne hledat adresáře nebo podadresáře. Místo toho hledejte pouze odpovídající soubor mezi soubory výslovně uvedenými na příkazovém řádku.

Ve vašich příkladech byly na příkazovém řádku uvedeny pouze adresáře a žádný z nich nebyl pojmenován file1. Proto žádný výstup.

Obecně lze na příkazovém řádku pojmenovat mnoho souborů a adresářů. Zde například vyzkoušíme příkaz find s 11 soubory a adresáři na příkazovém řádku:

$ 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 

Překrývající se cesty

Zvažte:

$ 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 

Jak Ramesh zdůrazňuje, podle všeho bude následovat find každá cesta zadaná na příkazovém řádku a hledat shody, i když cesty vedou ke stejnému souboru, jako v . file, nebo dokonce i v případě, že jsou cesty přesné duplikáty, jako v file1 file1.

Komentáře

  • děkuji. Jak ale mohu na příkazový řádek předat některé názvy souborů?
  • Dobrá poznámka. Viz moje aktualizovaná odpověď. Před prvním testem můžete dát tolik, kolik chcete. Například: find * -maxdepth 0 -name "file1". V * bude na příkazovém řádku uveden každý soubor v aktuálním adresáři.
  • @Ramesh Answer znovu aktualizována, doufám, lepším vysvětlením a příklady.
  • ještě jednou děkuji. Aktualizoval jsem svou otázku o další podrobnosti z vaší poslední aktualizace.
  • @Ramesh Nemohu ji najít zdokumentovanou, ale vidím stejné chování jako vy: find se podívá na každou cesta na příkazovém řádku a hlásí shody na každém, i když se jedná o duplikáty.

Odpověď

Pokud chcete nerekurzivně najít soubory (nikoli adresáře) v adresáři, použijte:

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

-maxdepth 0 nebude prohledávat . Pokusí se pouze najít shodu mezi názvy souborů / adresářů, které jste zadali jako argumenty v find. Např. ve výše uvedeném prohlášení by se pomocí hodnoty 0 pokusilo porovnat file1 s . který neodpovídá. Předáním * namísto . by bash nahradil * seznamem souborů v aktuálním adresáři což by vrátilo shodu.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *