Próbuję wyszukać plik o nazwie Book1 .
W moim teście próbuję wyszukać wspomniany plik, aw tym teście nie wiem, gdzie ten plik się znajduje.
Próbowałem, find / -iname book1
ale nie ma wyjścia.
Jak znaleźć plik o nazwie book1 przy użyciu wiersza polecenia, jeśli nie wiem, gdzie plik się znajduje?
EDYTOWAĆ:
Mój scenariusz jest opisany bardziej szczegółowo poniżej:
- Rozszerzenie pliku jest nieznane
- Dokładna nazwa (tj. Wielkie litery, cyfry itp.) Jest nieznana
- Lokalizacja pliku jest nieznana
command-line
files
find
Aspire27
źródło
źródło
Book1
, który znajduje się w katalogu, który można odczytać, tofind / -iname book1
go znajdzie. Jesteś pewien, że tak jestBook1
, a nieBook1.xyz
?find
ilocate
.locate
jest hojny i znajdzie wszystko, co pasuje, o ile znajduje się w bazie danych, która jest zwykle aktualizowana codziennie.find
, w tym przypadku szuka globu plików, rodzaju wzorca, którego byś użyłls
. Prawdopodobnie masz na myśliiname '*book1*'
. Zauważ, że wzorzec musi znajdować się w cudzysłowie, aby powłoka nie mogła go rozwinąć, zanimfind
go zobaczy. Zauważ też, żefind
podobnie jak wiele komend * nix, jest frustrująco cichy, gdy kończy się niepowodzeniem.Odpowiedzi:
Po pierwsze argumentem
-iname
jest wzór powłoki . Możesz przeczytać więcej o wzorach w instrukcji Bash . Istotą jest to, żefind
aby faktycznie znaleźć plik, nazwa pliku musi pasować do określonego wzorca. Abybook1
dopasować ciąg znaków bez rozróżniania wielkości literBook1.gnumeric
, musisz dodać,*
aby wyglądało to tak:lub podaj pełną nazwę:
Po drugie,
-iname
pozwolifind
zignorować sprawę nazwy pliku, więc jeśli określenie-iname book1
to może również znaleźćBook1
,bOok1
itd. Jeśli masz pewność, że plik szukasz nazywa sięBook1.gnumeric
wtedy nie używać-iname
, ale-name
będzie to szybciej:Po trzecie, pamiętaj o zacytowaniu wzoru, jak powiedziano w drugiej odpowiedzi .
I na koniec - czy jesteś pewien, że chcesz szukać pliku wszędzie w systemie? Możliwe, że plik, którego szukasz, znajduje się w twoim
$HOME
katalogu, jeśli pracowałeś nad tym lub skądś go pobrałeś. Znowu może to być znacznie szybsze.EDYCJA :
Zauważyłem, że zredagowałeś swoje pytanie. Jeśli nie znasz pełnej nazwy pliku, wielkich liter i lokalizacji, powinieneś użyć czegoś takiego:
Sugeruję również umieszczenie
2>/dev/null
na końcu wiersza, aby ukryć wszystkie*permission denied*
i inne błędy, które pojawią się, jeśli wywołaszfind
jako użytkownik inny niż root:A jeśli masz pewność, że szukasz pojedynczego pliku, a w systemie jest tylko jeden plik, który spełnia kryteria, które możesz powiedzieć,
find
aby wyjść po znalezieniu pierwszego pasującego pliku:źródło
-iname
nie jest przenośnyMożesz spróbować wykonać
locate
polecenie. Korzysta z bazy nazw plików, aby wyszukiwanie było szybsze.Aby wyszukać wszystkie pasujące pliki
*book1*
i ignorować wielkość liter, możesz użyćjeśli chcesz wyszukać pliki zaczynające się od
book1
, musisz samodzielnie wykonać znak zastępczy:Jest znacznie szybszy niż
find
, ale jest tak aktualny, jak podczas ostatniej aktualizacji bazy danych.źródło
Jeśli wiesz, że masz plik o nazwie
book1.something
, którego lokalizacja, dokładna wartośćsomething
i wzorzec wielkości liter nazwy pliku są nieznane:Jeśli wszystko, co wiesz na pewno, to że nazwa pliku zawiera słowo
book
, możesz wygenerować prawdopodobnie znacznie większą listęArgumentem
-name
jest wzór globu powłoki. W katalogu, w którym znajduje się plik, porównaj:Jest to rodzaj wyszukiwania przeprowadzanego przez
-name
. Ta-iname
opcja pozwala po prostu rozróżnić wielkość liter.źródło
POSIXly,
Zgłosi się ścieżki wszystkich plików, których nazwa zawiera
book1
(z dowolnej odmianie przypadku, ale tylko biorąc pod uwagę ASCII alfabecie łacińskimbokBOK
, a nie wiele innych odmian jak w Unicode𝗄
,𝚔
,𝘬
,ᵏ
,ₖ
,K
,k
i wszystkie ich odmiany ze znakami diakrytycznymi ...) w wszystkie katalogi, do których masz dostęp do odczytu.źródło
Do tego rodzaju zadań zawsze wykonuję:
find / -iregex '.*Book1.*'
Ta forma zająłaby 3 punkty twojego scenariusza (
iregex
jest to racjonalne wyrażenie bez rozróżniania wielkości liter, a wzorzec z.*
obu stron pasowałby do każdej postaci przed i po ustalonym wzorcu Book1 - to oczywiście może dać ci więcej wyników niż to konieczne ale na pewno nie przegapisz pliku)Główną różnicą: jeśli to możliwe, być bardziej restrykcyjne niż tylko za pomocą
/
, jak próbuje tylko/home
czy tak, w przeciwnym razie będzie zejść w niektórych katalogów, które nie są istotne (/sys
,/dev
itp ...)Pamiętaj jednak, że obowiązują uprawnienia Unix: jeśli plik znajduje się w katalogu, do którego użytkownik uruchamiający
find
komendę nie ma prawa dostępu (wykonania),find
nie będzie mógł go tam znaleźć.źródło
find
Silver Searcher to bardzo szybkie i wygodne narzędzie do wyszukiwania plików i treści.
Aby rozwiązać problem, polecenie srebrnego wyszukiwania będzie wyglądać tak ...
ag -g Book1
-g PATTERN
Drukuj nazwy plików pasujące do WZORCAźródło
locate
a jego warianty wydają się być szybką metodą.Jeśli lokalizacja nie jest dostępna, możesz
find
zamiast tego użyć . Zwykle jest znacznie wolniejszy, ale także znacznie bardziej precyzyjny.Jeśli masz jedną partycję: (uruchom jako root, jeśli użytkownik może nie mieć dostępu do pliku)
Jeśli nie uwzględnisz
-xdev
find
wyszukiwania rzeczy na innych partycjach, takich jak/proc
i/sys
, które mają tendencję do zalewania ekranu błędami, szczególnie jeśli nie jesteś rootem. (Błędy można ukryć, dodając je2> /dev/null
na końcu polecenia find (komentarz powinien zostać usunięty))Jeśli masz wiele partycji i nie wiesz, na której z nich znajduje się plik, możesz uzyskać listę
lsblk
(w systemach operacyjnych Linux, parsowaniedf
danych wyjściowych jest opcją w przeciwnym razie) i podać je w pliku find: (root ponownie, jeśli nie wiem, czy możesz uzyskać dostęp do pliku)(Jest to trochę niestabilne, jeśli któryś z punktów montowania ma spacje w środku) (
df
parametry mogą wymagać dostrajania. -P powoduje, że GNUdf
daje standardowe wyjście POSIX. Inne wersje mogą mieć inne parametry lub wymagać ich pominięcia. Przeczytaj stronę podręcznika)Nie
grep -F
obejmuje innych rzeczy zwróconych, takich jak partycje wymiany.W wersji innej niż GNU awk znajduje urządzenia z
/dev
podłączeniem, zaczynając od, aby uzyskać prawdziwe systemy plików, a następnie drukuje ostatnie pole (mountpoint) zdf
wyjścia.Zakłada to również powłokę typu bourne (
ksh
ibash
powinna działać. Jeśli używaszcsh
wariantu, uruchom skryptowalną powłokę przed wypróbowaniem tego)źródło
grep
s może być nieco głośno, nauczyć się filtrować go lepiej (to nie powinno być potrzebne na przykładzie, ale jeśli jest coś bardziej powszechne, że jest poszukiwany, to greps musiałby strojenie, aby utrzymać poziom hałasu w dół)ag (srebrny wyszukiwarka) zapewnia bardzo szybkie wyszukiwanie w plikach, a także ma opcję wyszukiwania nazwy pliku:
Więc w moim przypadku użycia jest> 30 razy szybszy, jeśli plik nie jest plikiem ignorowanym przez ag.
źródło