Linux znajduje nazwy plików z podanym ciągiem

107

Jestem na Ubuntu i chciałbym znaleźć wszystkie pliki w bieżącym katalogu i podkatalogach, których nazwa zawiera ciąg „John”. Wiem, że grepmoże pasować do zawartości plików, ale nie mam pojęcia, jak go użyć z nazwami plików. Każda pomoc będzie mile widziana.

JJ Beck
źródło

Odpowiedzi:

195

Użyj polecenia znajdź ,

find . -type f -name "*John*"
Rich Adams
źródło
1
Utworzenie niestandardowego skryptu bash za pomocą #!/bin/bash if [ -z $1 ]; then echo "Error: Specify pattern for search"; else /usr/bin/find . -type f -name "*$1*"; fi umożliwiłoby uruchomienie F search-stringjako idealnego skrótu
Ilia Rostovtsev
@IliaRostovtsev - fajnie, ale [ -z "$1" ]byłoby trochę lepiej.
Joe
@Joe Ah, racja. Masz na myśli na wypadek, gdyby ścieżka miała spacje? Ale tutaj sprawdzamy tylko, czy istnienie 1 $ miejsca spowoduje pojawienie się 2 $ i to wszystko. Masz na myśli to, że teoretycznie jest lepiej, prawda?
Ilia Rostovtsev
@IliaRostovtsev - Właściwie to się myliłem. Jeśli $ 1 jest zerowe, test staje się if [ -z ]. Myślałem, że to byłby błąd składniowy, ale działa. Od teraz mogę uprościć część mojego kodu.
Joe
25

Prawidłowa odpowiedź została już dostarczona, ale abyś nauczył się, jak sobie pomóc, pomyślałem, że wrzucę coś pomocnego w inny sposób; jeśli możesz podsumować to, co próbujesz osiągnąć jednym słowem, w systemie Linux jest bardzo dobra funkcja pomocy.

man -k <your search term>

To powoduje wyświetlenie wszystkich poleceń, które mają wyszukiwane hasło w krótkim opisie. Zwykle jest duża szansa, że znajdziesz to, czego szukasz. ;)

Ten wynik może czasami być nieco przytłaczający i zalecałbym zawężenie go do plików wykonywalnych, a nie wszystkich dostępnych stron podręcznika, na przykład:

man -k find | egrep '\(1\)'

lub, jeśli chcesz również poszukać poleceń wymagających wyższych poziomów uprawnień, takich jak ten:

man -k find | egrep '\([18]\)'
tink
źródło
3
Jestem ciekawy ... pytanie, które nie wskazuje na żadną próbę rozwiązania problemu za pomocą wyszukiwania, zyskuje pozytywny głos, przyjazne wyjaśnienie, jak dowiedzieć się o możliwych poleceniach, zostaje zdeptane. Jakie są kryteria? :)
tink
1
Głosowałem za tobą. lekcja jest niewielka. ale możemy zobaczyć próbki i dostosować :)
tgkprog
2

Plik findPolecenie zajmie dużo czasu, ponieważ skanuje prawdziwe plików systemu plików.

Najszybszym sposobem jest użycie locatepolecenia, które natychmiast da wynik:

locate "John"

Jeśli polecenie nie zostanie znalezione, musisz zainstalować mlocatepakiet i uruchomićupdatedb polecenie, aby przygotować bazę danych wyszukiwania po raz pierwszy.

Więcej szczegółów tutaj: https://medium.com/@thucnc/the-fastest-way-to-find-files-by-filename-mlocate-locate-commands-55bf40b297ab

thucnguyen
źródło
1

użyj Ack to proste. po prostu wpiszack <string to be searched>

Annu
źródło
Wygląda na to, że obejmie to również wszystkie ścieżki zawierające wyszukiwany tekst, a nie tylko pliki: stackoverflow.com/questions/7698867/ ...
underscore_d
1

To bardzo proste rozwiązanie przy użyciu treepolecenia w katalogu, którego szukasz. -fpokazuje pełną ścieżkę do pliku i |służy do potokowania wyjścia drzewa do greppliku zawierającego ciąg filenamew nazwie.

tree -f | grep filename
caylus
źródło