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
-
grep
s 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].*"
Book1
i znajduje się w katalogu, który możesz przeczytać, a następniefind / -iname book1
znajdzie go. Czy na pewno jest toBook1
, 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 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, zanimfind
go zobaczy. Zauważ też, żefind
, podobnie jak wiele poleceń * nix, jest frustrująco ciche, gdy się nie powiedzie.