Znajdź wszystkie pliki, których nazwa zawiera ciąg

177

Szukałem polecenia, które zwróci pliki z bieżącego katalogu, które zawierają ciąg w nazwie pliku. Widziałem locatei findpolecenia, które mogą znaleźć pliki zaczynające się od czegoś first_word*lub kończące się na czymś *.jpg.

Jak mogę zwrócić listę plików, które zawierają ciąg znaków w nazwie pliku?

Na przykład, jeśli 2012-06-04-touch-multiple-files-in-linux.markdownbył to plik w bieżącym katalogu.

Jak mogę zwrócić ten plik i inne pliki zawierające ciąg touch? Za pomocą polecenia, takiego jakfind '/touch/'

Dru
źródło
pytanie jest zagmatwane. chcesz znaleźć pliki, które zawierają ciąg znaków, czy pliki, których nazwy zawierają ten ciąg? na pierwsze pytanie odpowiada man grep, a na drugie man find. dlaczego miałbyś szukać w Google zamiast używać człowieka, nie wiem.
tylko ktoś.
1
Dzięki! W pierwszym zdaniu nie określono, czy chodzi o zawartość pliku, czy o jego nazwę. Zaktualizowano.
Dru,

Odpowiedzi:

303

Zastosowanie find:

find . -maxdepth 1 -name "*string*" -print

Znajdzie wszystkie pliki w bieżącym katalogu (usuń, maxdepth 1jeśli chcesz, aby były rekurencyjne) zawierające „ciąg znaków” i wydrukuje je na ekranie.

Jeśli chcesz uniknąć pliku zawierającego „:”, możesz wpisać:

find . -maxdepth 1 -name "*string*" ! -name "*:*" -print

Jeśli chcesz użyć grep(ale myślę, że nie jest to konieczne, o ile nie chcesz sprawdzać zawartości pliku), możesz użyć:

ls | grep touch

Ale powtarzam, findto lepsze i czystsze rozwiązanie dla twojego zadania.

Zagorax
źródło
Dzięki @Zagorax. Robi to dokładnie. Szkoda, że ​​polecenie nie było tak długie, ale ayee :)
Dru
2
@Dru, zmodyfikowano, aby zakryć wielkość liter, jeśli chcesz uniknąć dwukropków. findto bardzo potężne narzędzie, musi być w jakiś sposób „długie”. :)
Zagorax
Dzięki temu pierwszy zrobił to doskonale, nie zwracając żadnych treści.
Dru
3
@Dru, jeśli chcesz, aby był „krótszy”, możesz tego uniknąć, -printponieważ jest to zachowanie domyślne, a .ponieważ jest to domyślny folder, w którym sprawdza.
Zagorax
1
find . -name "*string*"Działa też świetnie. Usunięcie .powoduje błąd po mojej stronie. Jeszcze raz dziękuję @Zagorax.
Dru,
14

Użyj grep w następujący sposób:

grep -R "touch" .

-Roznacza powtarzanie się. Jeśli wolisz nie wchodzić do podkatalogów, pomiń to.

-ioznacza „ignoruj ​​wielkość liter”. Może się okazać, że warto spróbować.

carlspring
źródło
Wspaniały. Zauważyłem, że niektóre treści plików są zgodne z rozszerzeniem :. Czy w ogóle można to wstrzymać? Może korzystasz z opcji?
Dru,
1
Spróbuj:grep -R "touch" . | cut -d ":" -f 2
carlspring
Wydaje się, że tworzy to tylko zawartość plików. Jednak zasadniczo odpowiedziałeś na moje pytanie, mogę spróbować ukryć zawartość.
Dru,
Ach ... potrzebujesz tylko nazw plików? Biegnij: grep -R "touch" . | cut -d ":" -f 1 (przepraszam, musiałem cię źle przeczytać).
carlspring
Dzięki @carlspring to jest interesujące. grepzwraca pliki z zawartością i nazwami plików, które zawierają touchlub zawierają touch, nie jestem jeszcze pewien, co tak jest. Z listy zwróconych plików połowa zawiera touchtytuł, a druga połowa jest zawarta touchw treści, a nie w tytule. Właśnie to sobie uświadomiłem.
Dru,
5

-maxdepthOpcja powinna być przed -nameopcji, jak poniżej.,

find . -maxdepth 1 -name "string" -print
Sunil Dias
źródło
1
Musisz umieścić * przed i po „ciągu znaków”.
Aerin
3
find $HOME -name "hello.c" -print

Spowoduje to przeszukanie całego $HOME(tj. /home/username/) Systemu w poszukiwaniu plików o nazwie „hello.c” i wyświetlenie ich ścieżek:

/Users/user/Downloads/hello.c
/Users/user/hello.c

Jednak nie będzie pasować do HELLO.Club HellO.C. Aby dopasować, nie jest rozróżniana wielkość liter, podaj -inameopcję w następujący sposób:

find $HOME -iname "hello.c" -print

Przykładowe wyniki:

/Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c

Przekaż -type fopcję wyszukiwania tylko plików:

find /dir/to/search -type f -iname "fooBar.conf.sample" -print
find $HOME -type f -iname "fooBar.conf.sample" -print

-inameDziała zarówno na GNU lub BSD (w tym OS X) wersja polecenia find. Jeśli twoja wersja polecenia find nie obsługuje -iname, wypróbuj następującą składnię, używając greppolecenia:

find $HOME | grep -i "hello.c"
find $HOME -name "*" -print | grep -i "hello.c"

LUB spróbuj

find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print

Przykładowe wyniki:

/Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c
shilovk
źródło
0

Jeśli ciąg znaków znajduje się na początku nazwy, możesz to zrobić

$ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt
Steven Penny
źródło
3
compgennie jest odpowiednim młotkiem do tego gwoździa. To mało używane narzędzie zostało zaprojektowane do wyświetlania listy dostępnych poleceń i jako takie wyświetla pliki w bieżącym katalogu (które mogą być skryptami) i nie może ani powtarzać, ani przeszukiwać początku nazwy pliku, ani przeszukiwać zawartości pliku, dzięki czemu w większości bezużyteczne.
msanford,
0

Alternatywą dla wielu już dostarczonych rozwiązań jest wykorzystanie globu **. Kiedy używasz bashz opcją globstar( shopt -s globstar) lub używasz zsh, możesz po prostu użyć **do tego globu .

**/bar

wykonuje cykliczne wyszukiwanie plików o nazwach bar(potencjalnie włączając plik barw bieżącym katalogu). Zauważ, że nie można tego łączyć z innymi formami globalizacji w tym samym segmencie ścieżki; w takim przypadku *operatorzy powracają do swoich zwykłych efektów.

Zauważ, że istnieje subtelna różnica między zshi bashtutaj. Podczas gdy bashbędzie przechodzić przez miękkie linki do katalogów, zshnie będzie. W tym celu musisz użyć globu ***/w zsh.

kvantour
źródło
0
find / -exec grep -lR "{test-string}" {} \;
Shahid
źródło
1
Ta odpowiedź została oznaczona jako niska. Proszę wyjaśnić, co robią proponowane zmiany.
Miroslav Glamuzina
-2
grep -R "somestring" | cut -d ":" -f 1
Saurabh kukade
źródło
2
Wydaje się, że jest to odpowiedź na inne pytanie - ale ponieważ nie podałeś żadnego wyjaśnienia, nie jest to oczywiste dla pytającego ani dla nikogo innego.
Toby Speight