Szukałem polecenia, które zwróci pliki z bieżącego katalogu, które zawierają ciąg w nazwie pliku. Widziałem locate
i find
polecenia, 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.markdown
był 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/'
man grep
, a na drugieman find
. dlaczego miałbyś szukać w Google zamiast używać człowieka, nie wiem.Odpowiedzi:
Zastosowanie
find
:find . -maxdepth 1 -name "*string*" -print
Znajdzie wszystkie pliki w bieżącym katalogu (usuń,
maxdepth 1
jeś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,
find
to lepsze i czystsze rozwiązanie dla twojego zadania.źródło
find
to bardzo potężne narzędzie, musi być w jakiś sposób „długie”. :)-print
ponieważ jest to zachowanie domyślne, a.
ponieważ jest to domyślny folder, w którym sprawdza.find . -name "*string*"
Działa też świetnie. Usunięcie.
powoduje błąd po mojej stronie. Jeszcze raz dziękuję @Zagorax.Użyj grep w następujący sposób:
-R
oznacza powtarzanie się. Jeśli wolisz nie wchodzić do podkatalogów, pomiń to.-i
oznacza „ignoruj wielkość liter”. Może się okazać, że warto spróbować.źródło
:
. Czy w ogóle można to wstrzymać? Może korzystasz z opcji?grep -R "touch" . | cut -d ":" -f 2
grep -R "touch" . | cut -d ":" -f 1
(przepraszam, musiałem cię źle przeczytać).grep
zwraca pliki z zawartością i nazwami plików, które zawierajątouch
lub zawierajątouch
, nie jestem jeszcze pewien, co tak jest. Z listy zwróconych plików połowa zawieratouch
tytuł, a druga połowa jest zawartatouch
w treści, a nie w tytule. Właśnie to sobie uświadomiłem.-maxdepth
Opcja powinna być przed-name
opcji, jak poniżej.,źródło
Spowoduje to przeszukanie całego
$HOME
(tj./home/username/
) Systemu w poszukiwaniu plików o nazwie „hello.c” i wyświetlenie ich ścieżek:Jednak nie będzie pasować do
HELLO.C
lubHellO.C
. Aby dopasować, nie jest rozróżniana wielkość liter, podaj-iname
opcję w następujący sposób:Przykładowe wyniki:
Przekaż
-type f
opcję wyszukiwania tylko plików:-iname
Dział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ącgrep
polecenia:LUB spróbuj
Przykładowe wyniki:
źródło
Jeśli ciąg znaków znajduje się na początku nazwy, możesz to zrobić
źródło
compgen
nie 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.Alternatywą dla wielu już dostarczonych rozwiązań jest wykorzystanie globu
**
. Kiedy używaszbash
z opcjąglobstar
(shopt -s globstar
) lub używaszzsh
, możesz po prostu użyć**
do tego globu .wykonuje cykliczne wyszukiwanie plików o nazwach
bar
(potencjalnie włączając plikbar
w 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
zsh
ibash
tutaj. Podczas gdybash
będzie przechodzić przez miękkie linki do katalogów,zsh
nie będzie. W tym celu musisz użyć globu***/
wzsh
.źródło
źródło
źródło