Jak znaleźć plik z dowolnego katalogu

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:

  1. Rozszerzenie pliku jest nieznane
  2. Dokładna nazwa (tj. wielkie litery, cyfry itp.) jest nieznana
  3. lokalizacja pliku jest nieznana

Komentarze

  • Jeśli istnieje plik o nazwie Book1 i znajduje się w katalogu, który możesz przeczytać, a następnie find / -iname book1 znajdzie go. Czy na pewno jest to Book1, a nie Book1.xyz?
  • Pełna nazwa pliku to Book1. gnumeric. Mówisz, że muszę podać całą nazwę pliku? Z jakiegoś powodu pomyślałem, że dla tego konkretnego polecenia potrzebuję tylko ' d, to ogólna nazwa pliku. Mój test próbuje znaleźć plik, jeśli na przykład nie ' nie pamiętam rozszerzenia pliku i znam tylko jego nazwę. ' szukam. Proszę o poradę.
  • @don_crissti Gotowe. Zobacz powyżej Edytuj.
  • Łączysz find i locate. 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ś w ls. Prawdopodobnie masz na myśli iname '*book1*'. Zauważ, że wzorzec musi znajdować się w cudzysłowie, aby powłoka nie rozwijała go, zanim find go zobaczy. Zauważ też, że find, podobnie jak wiele poleceń * nix, jest frustrująco ciche, gdy się nie powiedzie.

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 𝗄, 𝚔, 𝘬, , , , 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].*" 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *