Moim celem jest znalezienie wszystkich plików pdf na zdalnej maszynie, więc uciekam się do przydatnego polecenia find
. Więc piszę
znajdź ~ * .pdflub
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?
find
jest daleki od bezużytecznego.find
jest intuicyjny. Prawdopodobnie mógłbym powiedzieć to samo ładniejszym tonem; czasami reaguję na (głupie) negatywne komentarze.Odpowiedzi:
find
jest daleki od bezużytecznego. Po prostu nie używasz go poprawnie.próbować:
find . -type f -iname '*.pdf'
źródło
Spójrz na dokumentację Findutils .
find
Komenda jest niezwykle potężny, a co za tym idzie, ma nieco skomplikowany interfejs. Możesz robić, co chcesz: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:
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.
źródło
Po prostu brakuje predykatu, który mówi, czego szukasz (np
-name
.)Aby znaleźć w katalogu domowym według nazwy:
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:
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):
Aby upewnić się, że find podąża za dowiązaniami symbolicznymi (zwykle chcę to zrobić podczas wyszukiwania):
Aby zrobić coś ze znalezionymi plikami: możesz zrzucić to do pliku za pomocą przekierowania standardowego (np. Tack na
> filename
końcu) lub użyć-exec
opcji, aby uruchomić polecenie (szczegóły na stronie man). Ten ostatni uruchamia jednak polecenie dla każdego pliku na raz. często jest szybsze, abyxargs
polecenie 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:I ostatnie rozszerzenie, aby ostatnie polecenie działało poprawnie, jeśli masz pliki i katalogi ze spacjami:
źródło
spójrz na ten samouczek
myślę, że chcesz to zrobić
źródło
iname
atrybutu dla lepszego widzenia na korytarzuKiedyś łączyłem znalezisko z grep like
odnaleźć . . | grep -i ".pdf"
może nie jest bardzo wydajny, ale dobrze sobie radzi.
źródło
find
bezpoś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.Znajdź pliki, które chcesz pobrać w ciągu ostatnich x dni
znajdzie pliki pdf w twoim
~
katalogu domowym i poniżej z rozszerzeniem.pdf
niezależnie od wielkich i małych liter (to jest i ininame
) i zmodyfikowane do 1 dnia temu, ponieważ dodałemmtime -1
; jeśli wpiszesz -60 w mtime, będzie to ostatnie 60 dni.źródło
Aby wykonać wyszukiwanie w „znalezionych” plikach, istnieje następująca konstrukcja:
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”.
źródło