(Zakładam, że GNU findtutaj)
Używam tylko
find filename
byłoby szybkie, ponieważ zwróciłoby się po prostu filename, lub nazwy w środku, filenamejeśli jest to katalog, lub błąd, jeśli ta nazwa nie istniała w bieżącym katalogu. Jest to bardzo szybka operacja, podobna do ls filename(ale rekurencyjna, jeśli filenamejest katalogiem).
W przeciwieństwie,
find | grep filename
pozwoli findwygenerować listę wszystkich nazw z bieżącego katalogu i poniżej, które grepnastępnie zostaną odfiltrowane. Byłoby to oczywiście znacznie wolniejsze działanie.
Zakładam, że to, co faktycznie było zamierzone, było
find . -type f -name 'filename'
Będzie to wyglądało filenamejak nazwa zwykłego pliku w dowolnym miejscu w bieżącym katalogu lub poniżej.
Będzie to tak szybkie (lub porównywalnie szybkie), jak find | grep filename, ale greprozwiązanie będzie pasować filenamedo pełnej ścieżki każdej znalezionej nazwy, podobnie do tego -path '*filename*', co by to zrobiło find.
Zamieszanie wynika z niezrozumienia sposobu finddziałania.
Narzędzie pobiera wiele ścieżek i zwraca wszystkie nazwy poniżej tych ścieżek.
Następnie możesz ograniczyć zwracane nazwy za pomocą różnych testów, które mogą oddziaływać na nazwę pliku, ścieżkę, znacznik czasu, rozmiar pliku, typ pliku itp.
Kiedy powiesz
find a b c
poprosisz findo podanie wszystkich nazw dostępnych w ramach trzech ścieżek a, boraz c. Jeśli są to nazwy zwykłych plików w bieżącym katalogu, zostaną one zwrócone. Jeśli którykolwiek z nich jest nazwą katalogu, zostanie on zwrócony wraz ze wszystkimi dalszymi nazwami w tym katalogu.
Kiedy robię
find . -type f -name 'filename'
Generuje to listę wszystkich nazw w bieżącym katalogu ( .) i poniżej. Następnie ogranicza nazwy do zwykłych plików, tj. Nie katalogów itp -type f. Za pomocą . Następnie istnieje dalsze ograniczenie nazw, które pasują filenameprzy użyciu -name 'filename'. Ciąg filenamemoże być wzorcem globowania nazw plików, takim jak *.txt(pamiętaj, żeby go zacytować!).
Przykład:
Następujące zdaje się „znajdować” plik wywołany .profilew moim katalogu domowym:
$ pwd
/home/kk
$ find .profile
.profile
Ale w rzeczywistości zwraca wszystkie nazwy na ścieżce .profile(jest tylko jedna nazwa, i to z tego pliku).
Następnie cdprzechodzę na wyższy poziom i próbuję ponownie:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
findKomenda teraz nie mogę znaleźć żadnej ścieżki nazwie .profile.
Jeśli jednak popatrzę na bieżący katalog, a następnie ograniczę tylko zwrócone nazwy.profile , znajdzie je również stamtąd:
$ pwd
/home
$ find . -name '.profile'
./kk/.profile