znajdź polecenie w systemie Linux, aby zlokalizować pliki pdf

11

Moim celem jest znalezienie wszystkich plików pdf na zdalnej maszynie, więc uciekam się do przydatnego polecenia find. Więc piszę

znajdź ~ * .pdf
lub
znajdź ~ "* .pdf"
i nic nie dostaję. Robię to samo na moim komputerze i nic nie dostaję. Robię regularne wyszukiwanie z menu na moim komputerze i znajduję sporo plików pdf. Czy ktoś mógłby mi powiedzieć, co robię źle?

akira
źródło
11
Trzymaj swoje negatywne opinie poza pytaniem, jeśli chcesz dobrej odpowiedzi. W pokrewnej historii findjest daleki od bezużytecznego.
wilhelmtell
8
Oczywiście masz prawo do wolności słowa. Ale chcesz dobrej odpowiedzi, prawda? Nie, nie masz prawa do dobrej konstruktywnej odpowiedzi. To przywilej.
wilhelmtell
2
Zły robotnik zawsze wini swoje narzędzia. Innymi słowy, czysty PBCAK tutaj.
Pascal Thivent
5
@Wilhelmtell, myślę, że wypowiedź Martina jest sprawiedliwa - komenda nigdy nie powinna była nazywać się „znajdź”, bardziej jak „walkpath_and_execute” ... nie ma najbardziej intuicyjnego lub przyjaznego dla użytkownika interfejsu i robi znacznie więcej niż po prostu znaleźć pliki. Prosta nazwa „znajdź” jest zwodnicza, ponieważ sugeruje prosty interfejs, którego nie ma. Oczywiście, znajdowanie jest dalekie od bezużytecznego i działa całkiem dobrze, ale początkującego trudno nie obwiniać za to, że nie zna różnicy między „znajdź”, „zlokalizuj”, „który” itp.
Michael Aaron Safyan
1
@Michael Nie obwiniałem tutaj nikogo; a raczej to nie ja obwiniałem tutaj. Nawet nie powiedziałem, że findjest intuicyjny. Prawdopodobnie mógłbym powiedzieć to samo ładniejszym tonem; czasami reaguję na (głupie) negatywne komentarze.
wilhelmtell

Odpowiedzi:

30

findjest daleki od bezużytecznego. Po prostu nie używasz go poprawnie.

próbować:

find . -type f -iname '*.pdf'

Mitch Dempsey
źródło
@Martin - chętnie Ci pomożemy, pamiętaj tylko o zaznaczeniu pytania jako odpowiedzi!
Mitch Dempsey
@stepancheg Tak, dlaczego nie zdejmiesz internetu i wydrukujesz wersję papierową.
bobobobo
9

Spójrz na dokumentację Findutils . findKomenda jest niezwykle potężny, a co za tym idzie, ma nieco skomplikowany interfejs. Możesz robić, co chcesz:

find . -type f -iname '*.pdf' 

Powyższe polecenie oznacza „znajdź w. Dla pozycji pliku typu z dopasowaniem nazwy bez rozróżniania wielkości liter * .pdf (i wypisz nazwę takich dopasowań)”. Polecenie find może faktycznie służyć do wykonywania poleceń na znalezionych plikach (zamiast lub oprócz drukowania nazw plików). Jednak dla twoich celów możesz czuć się bardziej komfortowo z poleceniem locate , które - zakładając, że zbudowałeś bazę danych locate za pomocą updatedb - bardzo ułatwia znajdowanie plików. Na przykład:

locate '*.pdf'

Przekonasz się również, że polecenie locate jest zwykle szybsze niż polecenie find, ponieważ locate używa indeksu nazw plików (baza danych locate), podczas gdy find przejdzie do hierarchii dla każdego wywołania.

Michael Aaron Safyan
źródło
6

Po prostu brakuje predykatu, który mówi, czego szukasz (np -name.)

Aby znaleźć w katalogu domowym według nazwy:

find ~ -name \*.pdf

Zauważ, że symbol wieloznaczny *musi być poprzedzony znakiem ucieczki, aby powłoka go nie zinterpretowała, zanim znajdzie ją w zasięgu ręki. Używanie '*.pdf'i "*.pdf"będzie miało taki sam efekt jak \*.pdf.

Aby znaleźć bez rozróżniania wielkości liter:

find ~ -iname \*.pdf

Aby przyciąć wyniki tylko do plików (wyrażenie nazwy prawdopodobnie zajmie się tym za Ciebie, ale na wypadek, gdybyś miał jakieś dziwnie nazwane katalogi):

find ~ -type f -iname \*.pdf

Aby upewnić się, że find podąża za dowiązaniami symbolicznymi (zwykle chcę to zrobić podczas wyszukiwania):

find ~ -follow -type f -iname \*.pdf

Aby zrobić coś ze znalezionymi plikami: możesz zrzucić to do pliku za pomocą przekierowania standardowego (np. Tack na > filenamekońcu) lub użyć -execopcji, aby uruchomić polecenie (szczegóły na stronie man). Ten ostatni uruchamia jednak polecenie dla każdego pliku na raz. często jest szybsze, aby xargspolecenie przekazało znalezione pliki jako argumenty do innego polecenia, jednocześnie lub dużych fragmentów naraz. Na przykład dla ad-hoc (ale nieindeksowanego) greps poprzez pliki nagłówkowe:

find ~ -follow -type f -name \*.h | xargs grep -nH "identifier"

I ostatnie rozszerzenie, aby ostatnie polecenie działało poprawnie, jeśli masz pliki i katalogi ze spacjami:

find ~ -follow -type f -name \*.h -print0 | xargs -0 grep -nH "identifier"
Owen S.
źródło
W rzeczywistości „* .pdf” rozwinąłby się, gdyby w bieżącym katalogu znajdowały się pliki z rozszerzeniem .pdf, prawda? (drobna uwaga)
Peter Jaric
1
Nie w bash. Z podręcznika bash: „Umieszczanie znaków w cudzysłowach zachowuje dosłowną wartość wszystkich znaków w cudzysłowach, z wyjątkiem [dolara], [cudzysłowu], [potoku], a gdy włączone jest rozszerzanie historii, [bang]. „ Spróbuj tego samodzielnie: ls „* .txt” w katalogu z plikami tekstowymi.
Owen S.
Tak, oczywiście masz rację. Nie wiem skąd wziął się ten pomysł. Dzięki za poprawienie mnie.
Peter Jaric
3

spójrz na ten samouczek

myślę, że chcesz to zrobić

find . -name "*.pdf"

źródło
Powinieneś użyć tego inameatrybutu dla lepszego widzenia na korytarzu
Mitch Dempsey
0

Kiedyś łączyłem znalezisko z grep like

odnaleźć . . | grep -i ".pdf"

może nie jest bardzo wydajny, ale dobrze sobie radzi.

Tiberiu Hajas
źródło
Można to zrobić w findbezpośrednio jeśli chce, poprzez -iregex: find ~ -iregex '.*\.pdf'. Problem polega na tym, findże wzór jest traktowany tak, jakby zawsze miał ^z przodu i $z tyłu, więc twój wzór musi być nieco bardziej skomplikowany. Zauważ też, że .w twoim wzorze jest tak naprawdę jednoznakowy symbol wieloznaczny, a nie dosłowny kropka.
Owen S.
0

Znajdź pliki, które chcesz pobrać w ciągu ostatnich x dni

find ~ -type f -iname '*.pdf' -mtime -1

znajdzie pliki pdf w twoim ~katalogu domowym i poniżej z rozszerzeniem .pdfniezależnie od wielkich i małych liter (to jest i in iname) i zmodyfikowane do 1 dnia temu, ponieważ dodałem mtime -1; jeśli wpiszesz -60 w mtime, będzie to ostatnie 60 dni.

r0berts
źródło
0

Aby wykonać wyszukiwanie w „znalezionych” plikach, istnieje następująca konstrukcja:

find <dir> -type f -iname <name> -exec grep -H <string> {} \;

Polecenie exec musi kończyć się znakiem ucieczki „;” i -H jest potrzebne, aby grep wydrukował ścieżkę pliku oprócz linii w pliku, w której znajduje się „string”.

Ted Ballou
źródło