(Zakładam, że GNU find
tutaj)
Używam tylko
find filename
byłoby szybkie, ponieważ zwróciłoby się po prostu filename
, lub nazwy w środku, filename
jeś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 filename
jest katalogiem).
W przeciwieństwie,
find | grep filename
pozwoli find
wygenerować listę wszystkich nazw z bieżącego katalogu i poniżej, które grep
nastę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 filename
jak 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 grep
rozwiązanie będzie pasować filename
do pełnej ścieżki każdej znalezionej nazwy, podobnie do tego -path '*filename*'
, co by to zrobiło find
.
Zamieszanie wynika z niezrozumienia sposobu find
dział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 find
o podanie wszystkich nazw dostępnych w ramach trzech ścieżek a
, b
oraz 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ą filename
przy użyciu -name 'filename'
. Ciąg filename
moż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 .profile
w 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 cd
przechodzę na wyższy poziom i próbuję ponownie:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
find
Komenda 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