2012-07-04 13 views
103

Szukałem polecenia, które zwróci pliki z bieżącego katalogu, które zawierają ciąg znaków w nazwie pliku. Widziałem komendy locate i find, które mogą znaleźć pliki rozpoczynające się od czegoś first_word* lub kończące się czymś *.jpg.Linux - Znajdź pliki z nazwą zawierającą ciąg

Jak mogę zwrócić listę plików zawierających ciąg w nazwie pliku? Na przykład, jeśli 2012-06-04-touch-multiple-files-in-linux.markdown był plikiem w bieżącym katalogu.

Jak mogę zwrócić ten plik i inne zawierające ciąg touch? Używając polecenia, takie jak find '/touch/'

+0

pytanie brzmi mylące. czy chcesz znaleźć pliki zawierające ciąg lub pliki, których * nazwy * zawierają wspomniany ciąg? na pierwsze pytanie odpowiada "man grep", a drugie "man find". dlaczego miałbyś google zamiast używać człowieka, nie wiem. –

+1

Dzięki! Pierwsze zdanie nie określało, czy jest to zawartość pliku czy nazwa pliku. Zaktualizowano. – Dru

Odpowiedz

157

Zastosowanie find:

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

To znajdzie wszystkie pliki w bieżącym katalogu (Delete maxdepth 1 jeśli chcesz to rekurencyjny) zawierające „ciąg” i drukuje go na ekranie.

Jeśli chcesz uniknąć plik zawierający „:”, można wpisać:

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

Jeśli chcesz użyć grep (ale myślę, że to nie jest konieczne, o ile nie chcą sprawdzić zawartość pliku) można użyć:

ls | grep touch

Ale, powtarzam, find jest lepsze i czystsze rozwiązanie dla Twojego zadania.

+0

Dzięki @Zagorax. Dokładnie to robi. Szkoda, że ​​polecenie nie było tak długie, ale ayee :) – Dru

+1

@Dru, Zmodyfikowano tak, aby ukryć przypadek, jeśli chcesz uniknąć dwukropków. 'find' jest bardzo potężnym narzędziem, musi być jakoś" długie ". :) – Zagorax

+0

Dzięki temu pierwsi zrobili to doskonale bez zwracania żadnych treści. – Dru

12

Zastosowanie grep następująco:

grep -R "touch" . 

-R oznacza rekursja. Jeśli wolisz nie wchodzić do podkatalogów, pomiń to.

-i oznacza "ignoruj ​​przypadek". Może się okazać, że warto spróbować.

+0

Świetnie. Zauważyłem, że niektóre treści plików podążają za ':'. Czy mimo to należy to powstrzymać? Może korzystając z opcji? – Dru

+1

Spróbuj: 'grep -R" touch ". | cut -d ":" -f 2' – carlspring

+0

Wydaje się, że tylko produkuje zawartość plików. Zasadniczo odpowiedziałaś na moje pytanie, ale mogę spróbować zrobić coś, co powstrzyma zawartość. – Dru

0

Jeśli łańcuch jest na początku nazwy, można to zrobić

$ compgen -f .bash 
.bashrc 
.bash_profile 
.bash_prompt 
+3

'compgen' nie jest odpowiednim młotkiem do tego gwoździa.To mało używane narzędzie zostało zaprojektowane w celu wyświetlania * dostępnych poleceń *, i jako takie wyświetla listę plików w katalogu * current * (które mogą być skryptami) i nie może ani rekurencyjnie ani wyglądać poza początkiem nazwy pliku ani pliku wyszukiwania zawartość, co czyni ją w większości bezużyteczną. – msanford

2

Opcja -maxdepth powinny być przed opcją -name, jak poniżej.,

find . -maxdepth 1 -name "string" -print 
+0

Musisz wstawić * przed i po "ciągu". – Aaron

1
find $HOME -name "hello.c" -print 

Spowoduje to przeszukanie całego systemu $HOME (tj. /home/username/) dla 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 zgodny z HELLO.C ani HellO.C.Aby dopasować jest opcja -iname sprawa niewrażliwe wprost następująco:

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

Przykładowe wyjścia:

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

Przepuścić opcję -type f tylko wyszukać pliki:

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

W -iname robót albo na polecenie GNU lub BSD (w tym OS X) znajdź polecenie. Jeśli wersja polecenia find nie obsługuje -iname, spróbuj następującej składni za pomocą grep polecenie:

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 

wyjść próbki:

/Users/user/Downloads/Z/HELLO.C 
/Users/user/Downloads/Z/HEllO.c 
/Users/user/Downloads/hello.c 
/Users/user/hello.c 
0
grep -R "somestring" | cut -d ":" -f 1 
+0

Wygląda na to, że jest to odpowiedź na inne pytanie - ale ponieważ nie dostarczyłeś żadnego wyjaśnienia, nie jest to oczywiste dla osoby pytającej lub kogokolwiek innego. –

Powiązane problemy