Próbuję znaleźć plik o nazwie Książka1 .
W moim teście próbuję znaleźć wspomniany plik, aw tym teście nie wiem, gdzie znajduje się ten plik.
Próbowałem find / -iname book1, ale nie ma wyjścia.
Jak znaleźć plik o nazwie book1 za pomocą wiersza poleceń, jeśli nie wiem gdzie znajduje się plik?
EDYCJA:
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
Komentarze
Odpowiedź
Po pierwsze, argumentem -iname jest wzorzec powłoki. Możesz przeczytać więcej o wzorcach w instrukcji Bash . Istota jest taka, że aby find faktycznie znaleźć plik, nazwa pliku musi pasować do określonego wzorca. Aby ciąg znaków bez rozróżniania wielkości liter book1 pasował do Book1.gnumeric, musisz albo dodać *, więc wygląda to tak:
find / -iname "book1*"
lub podaj pełną nazwę:
find / -iname "Book1.gnumeric"
Sekunda , -iname spowoduje, że find zignoruje wielkość liter w nazwie pliku, więc jeśli podasz -iname book1, może to również znajdź Book1, bOok1 itd. Jeśli „na pewno” plik, którego szukasz, nazywa się Book1.gnumeric to nie używaj -iname, ale -name, będzie szybsze:
find / -name "Book1.gnumeric"
Po trzecie, pamiętaj o cytowaniu wzorca, jak podano w innej odpowiedzi .
I na koniec – czy na pewno chcesz szukać tego pliku wszędzie w systemie? Możliwe, że plik, którego szukasz, znajduje się w Twoim $HOME jeśli pracowałeś nad tym lub pobrałeś go skądś. Ponownie, może to być znacznie szybsze.
EDYCJA :
Zauważyłem że zredagowałeś swoje pytanie. Jeśli nie znasz pełnej nazwy pliku, wielkości liter i lokalizacji, rzeczywiście powinieneś użyć czegoś takiego:
find / -iname "book1*"
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łasz find jako użytkownik inny niż root:
find / -iname "book1*" 2>/dev/null
A jeśli jesteś „pewien, że” szukasz pojedynczego pliku, a na Twoim system spełniający kryteria, które możesz nakazać find, aby zakończyć po znalezieniu pierwszego pasującego pliku:
find / -iname "book1*" -print -quit 2>/dev/null
Komentarze
Odpowiedź
Możesz wypróbować polecenie locate. Używa ono bazy danych nazw plików przyspieszyć wyszukiwanie.
Aby wyszukać wszystkie pasujące pliki *book1*, ignorując wielkość liter, możesz użyć
locate -i book1
jeśli chcesz wyszukiwać pliki zaczynające się od book1, musisz samodzielnie wpisać symbol wieloznaczny:
locate -i "book1*"
Jest znacznie szybszy niż find, ale jest tylko tak aktualny, jak ostatni raz, gdy baza danych była odświeżana.
Komentarze
- Żadne z nich nie wygenerowało dla mnie żadnych wyników:
locate -i after.sh,sudo locate -i "after.sh",sudo locate -i after.sh,sudo locate -i '*after.sh'
Odpowiedź
Jeśli wiesz, że masz plik o nazwie book1.something, w którym znajduje się lokalizacja pliku, dokładna wartość something , a wzorzec wielkich liter w nazwie pliku jest nieznany:
find / -iname "book1.*"
Jeśli wszystko, co wiesz na pewno, to to, że nazwa pliku zawiera słowo , możesz wygenerować prawdopodobnie znacznie większą listę za pomocą
find / -iname "*book*"
Argument do -name to wzorzec globu powłoki. W katalogu, w którym znajduje się plik, porównaj:
$ ls Book1 ls: cannot access "Book1": No such file or directory $ ls Book1.* Book1.gnumeric
To oznacza rodzaj wyszukiwania wykonywanego przez -name. Opcja -iname po prostu zezwala na wersję bez rozróżniania wielkości liter.
Odpowiedź
POSIXly,
LC_ALL=C find / -name "*[bB][oO][oO][kK]1*"
Poda ścieżkę do wszystkich plików, których nazwa zawiera book1 (z dowolną wersją wielkości , ale biorąc pod uwagę tylko łacińskie znaki ASCII bokBOK, a nie wiele innych odmian Unicode, takich jak 𝗄, 𝚔, 𝘬, ᵏ, ₖ, K, k i wszystkie ich odmiany ze znakami diakrytycznymi …) we wszystkich katalogach, do których masz dostęp do odczytu.
Odpowiedź
W Zsh możesz używać wzorców glob, więc to też działa:
ls -a /**/book1
To znaleźć wszystkie lokalizacje, w których znajduje się plik o nazwie book1.
W moich testach wydaje się to być szybsze niż użycie find, a także powoduje niewielkie lub żadne błędy uprawnień użytkownika , gdy jest uruchamiane bez uprawnień administratora
Zobacz manual .
Odpowiedź
Zawsze robię tego rodzaju zadania: find / -iregex ".*Book1.*"
Ten formularz zajmie się trzema punktami scenariusza (iregex to racjonalne wyrażenie niewrażliwe na wielkość liter, a wzór z .* po obu stronach będzie pasował do dowolnego znaku przed i po ustalonym wzorcu Book1 – może to oczywiście dać z powrotem więcej wyników niż to konieczne, ale na pewno nie przegapisz pliku)
Główna różnica: jeśli to możliwe, bądź bardziej restrykcyjny niż zwykłe używanie /, na przykład próbowanie tylko /home lub tak dalej, w przeciwnym razie zejdziesz do niektórych katalogów, które nie są istotne (/sys, /dev, itd…)
Pamiętaj jednak, że Unix permissi obowiązują: jeśli plik znajduje się w katalogu, do którego użytkownik wykonujący polecenie find nie ma prawa dostępu (wykonania), find będzie nie mogę go tam znaleźć.
Komentarze
- iregex won ' t pracować w miejscach takich jak Solaris (nie określono systemu operacyjnego) (i prawdopodobnie * BSD), jest to rozszerzenie GNU i nie jest częścią standardu
find
Odpowiedź
Wyszukiwarka srebra jest bardzo szybkim i poręcznym narzędziem do wyszukiwania plików i treści.
Aby rozwiązać twój problem, srebrne polecenie wyszukiwania wyglądałoby tak …
ag -g Book1
-g PATTERN Wydrukuj nazwy plików pasujące do WZORU
Odpowiedź
locate i jego warianty są zwykle szybką metodą.
# updatedb # run as root, possibly using sudo, e.g. sudo -b updatedb. If file is on the system for more than a day it should already be in the index and this can be skipped $ locate -i book1
Jeśli zlokalizuj nie jest avai lable, możesz zamiast tego użyć find. Zwykle jest dużo 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)
$ find / -xdev -iname "book1*" -print # If the iname extension to find is available $ find / -xdev -print | grep -F -i /book1 # if iname is not available
Jeśli nie uwzględnisz -xdev find, wyszukuje elementy na innych partycjach, np. /proc i /sys, które mają tendencję do zalewania ekranu błędami, zwłaszcza jeśli nie jesteś rootem.(Błędy można ukryć, dołączając 2> /dev/null na końcu polecenia find (komentarz powinien zostać usunięty))
Jeśli masz wiele partycji, a nie ” nie wiesz, na którym jest plik, możesz uzyskać listę z lsblk (w systemach operacyjnych opartych na Linuksie, analizowanie danych wyjściowych df jest opcja w przeciwnym razie) i wprowadź to do find: (root ponownie, jeśli nie wiesz, czy możesz uzyskać dostęp do pliku)
$ find $(lsblk -O MOUNTPOINT -n | grep -F /) -xdev -iname "book1*" -print # GNU-based OSes $ find $(df -P|awk "$1 ~ /^\/dev/ {print $NF}") -xdev | grep -F -i book1 # Non-GNU based OSes.
(To trochę krucha, jeśli którykolwiek z punktów montowania ma spacje w) (parametry df mogą wymagać dostrojenia. -P sprawia, że GNU df daje standardowe wyjście POSIX. Inne wersje mogą mieć inne parametry lub wymagać ich pominięcia. Przeczytaj swoją stronę podręcznika)
grep -F wyklucza inne zwracane rzeczy, takie jak partycje wymiany.
W wersji innej niż GNU awk wyszukuje urządzenia z montowaniem zaczynającym się od /dev, aby pobrać prawdziwe systemy plików, a następnie wypisuje ostatni plik d (punkt montowania) z wyjścia df.
Zakłada to również powłokę podobną do burne (ksh i bash powinno działać. Jeśli używasz wariantu csh, uruchom powłokę skryptową , zanim spróbujesz tego)
Komentarze
-
greps mogą być nieco hałaśliwe, dowiedz się, jak to filtrować lepiej (nie powinno to być potrzebne w przykładzie, ale jeśli jest to coś bardziej powszechnego, czego szuka się, greps wymagałoby dostrojenia, aby obniżyć poziom hałasu)
Odpowiedź
ag (srebrna wyszukiwarka) zapewnia bardzo szybkie wyszukiwanie w plikach, a także ma opcję wyszukiwania nazwy pliku:
>: time ag -g foo # uses heuristics to only look in desired locations apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg real 0m0.884s user 0m0.701s sys 0m0.178s >: time find . -name "*foo*" ./apps/ssr/dist/static/media/foo-illustration.jpg ./apps/vxy/dist/static/media/foo-illustration.jpg ./apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg real 0m29.744s user 0m2.108s sys 0m13.982s >: time ag -ug foo # searching all files is still faster and simpler to use then find command apps/ssr/dist/static/media/foo-illustration.jpg apps/vxy/dist/static/media/foo-illustration.jpg apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg real 0m16.698s user 0m1.951s sys 0m7.119s
Więc w moim przypadku tutaj jest to „s> 30 razy szybsze, jeśli plik nie jest plikiem ignorowanym przez ag.
Odpowiedź
find / -type f -iname "book[0-9].*"
Book1i znajduje się w katalogu, który możesz przeczytać, a następniefind / -iname book1znajdzie go. Czy na pewno jest toBook1, a nieBook1.xyz?findilocate.locatejest hojny i znajdzie wszystko, co pasuje, o ile znajduje się w bazie danych, która jest zwykle aktualizowana codziennie.find, w tym przypadku, szuka pliku glob, rodzaju wzorca, którego użyłbyś wls. Prawdopodobnie masz na myśliiname '*book1*'. Zauważ, że wzorzec musi znajdować się w cudzysłowie, aby powłoka nie rozwijała go, zanimfindgo zobaczy. Zauważ też, żefind, podobnie jak wiele poleceń * nix, jest frustrująco ciche, gdy się nie powiedzie.