Jak najít soubor z libovolného adresáře

Pokouším se vyhledat soubor s názvem Book1 .

V mém testu se pokouším vyhledat výše uvedený soubor a v tomto testu nevím, kde se daný soubor nachází.

Snažil jsem se find / -iname book1, ale neexistuje žádný výstup.

Jak najdu pomocí příkazového řádku svůj soubor s názvem book1, pokud nevím kde se soubor nachází?

EDIT:

Můj scénář je popsán podrobněji níže:

  1. Přípona souboru není známa.
  2. Přesný název (tj. velká písmena, číslice atd.) není znám.
  3. umístění souboru není známo

Komentáře

  • Pokud existuje soubor s názvem Book1 a nachází se v adresáři, který si můžete přečíst, a find / -iname book1 jej najde. Opravdu jste Book1 a ne Book1.xyz?
  • Celý název souboru je Book1. číselný. Říkáte, že musím specifikovat celý název souboru? Z nějakého důvodu jsem si pro tento konkrétní příkaz myslel, že vše, co ‚ d potřebuji, je obecný název souboru. Můj test se pokouší najít soubor, pokud si například ‚ nepamatuji příponu souboru a znám pouze název souboru. ‚ hledám. Prosím o radu.
  • @don_crissti Hotovo. Viz výše Upravit.
  • Mícháte find a locate. locate je velkorysý a najde vše, co odpovídá, pokud je ve své databázi, která je obvykle denně aktualizována. find v tomto případě hledá souborový glob, jakýsi vzor, který byste použili v ls. Pravděpodobně myslíte iname '*book1*'. Pamatujte, že vzor musí být uvnitř uvozovek, aby ho shell nerozbalil, než ho find uvidí. Všimněte si také, že find je stejně jako mnoho příkazů * nix frustrující, když je neúspěšný.

Odpovědět

Nejprve je argumentem -iname shell vzor . Další informace o vzorech si můžete přečíst v příručce Bash . Podstatou je, že aby find skutečně našel soubor, musí název souboru odpovídat zadanému vzoru. Chcete-li, aby řetězec nerozlišoval malá a velká písmena book1 odpovídal Book1.gnumeric, musíte buď přidat * tak vypadá to takto:

find / -iname "book1*" 

nebo zadejte celé jméno:

find / -iname "Book1.gnumeric" 

Druhý , -iname způsobí, že find bude ignorovat velikost souboru, takže pokud zadáte -iname book1, může to také najít Book1, bOok1 atd. Pokud jste si jisti, že hledaný soubor se jmenuje Book1.gnumeric pak nepoužívejte -iname, ale -name to bude rychlejší:

find / -name "Book1.gnumeric" 

Zatřetí, pamatujte na citování vzoru uvedeného v další odpovědi .

A poslední – jsou jste si jisti, že chcete hledat soubor kdekoli ve vašem systému? Je možné, že soubor, který hledáte, je ve vašem $HOME adresář, pokud jste na něm pracovali nebo jste si ho odněkud stáhli. To může být opět mnohem rychlejší.

EDIT :

Všiml jsem si že jste upravili svoji otázku. Pokud neznáte celý název souboru, velká písmena a umístění, měli byste použít něco podobného:

find / -iname "book1*" 

Navrhuji také umístit 2>/dev/null na konci řádku skryjete všechny *permission denied* a další chyby, které se vyskytnou, pokud vyvoláte find jako uživatel bez oprávnění root:

find / -iname "book1*" 2>/dev/null 

A pokud jste si jisti, že hledáte jeden soubor a ve vašem souboru je pouze jeden soubor systém, který odpovídá kritériím, můžete find ukončit po nalezení prvního vyhovujícího souboru:

find / -iname "book1*" -print -quit 2>/dev/null 

Komentáře

Odpověď

Můžete zkusit příkaz locate. Využívá databázi názvů souborů aby hledání bylo rychlejší.

Chcete-li vyhledat všechny odpovídající soubory *book1* a ignorovat velká a malá písmena, můžete použít

locate -i book1 

pokud chcete hledat soubory počínaje s book1, budete muset zástupný znak udělat sami:

locate -i "book1*" 

Je to mnohem rychlejší než find, ale je to jen tak aktuální jako při poslední aktualizaci databáze.

Komentáře

  • Žádný z nich pro mě nevytvořil žádný výstup: locate -i after.sh, sudo locate -i "after.sh", sudo locate -i after.sh, sudo locate -i '*after.sh'

odpověď

Pokud víte, že máte soubor s názvem book1.something, kde je umístění souboru, přesná hodnota something , a vzor velkých a malých písmen v názvu souboru jsou neznámé:

find / -iname "book1.*" 

Pokud vše, co víte jistě, je, že název souboru obsahuje slovo , můžete vygenerovat pravděpodobně mnohem větší seznam pomocí

find / -iname "*book*" 

Argument -name je vzor globálního prostředí. Z adresáře, ve kterém je soubor, porovnejte:

$ ls Book1 ls: cannot access "Book1": No such file or directory $ ls Book1.* Book1.gnumeric 

Toto představuje druh vyhledávání prováděného -name. Možnost -iname jednoduše umožňuje, aby se nerozlišovala malá a velká písmena.

Odpovědět

POSIXly,

LC_ALL=C find / -name "*[bB][oO][oO][kK]1*" 

Ohlásí cestu ke všem souborům, jejichž název obsahuje book1 (s jakoukoli variantou případu , ale pouze s ohledem na latinské znaky ASCII bokBOK, nikoli na mnoho dalších variant Unicode, jako je 𝗄, 𝚔, 𝘬, , , , a všechny jejich varianty s diakritikou …) ve všech adresářích, ke kterým máte přístup ke čtení.

Odpověď

S Zsh můžete použít glob vzory, takže to funguje také:

ls -a /**/book1 

Toto bude najít všechna umístění, kde žije soubor s názvem book1.

Při mém testování se to zdá být rychlejší než použití find a při spuštění bez oprávnění root také produkuje malé až žádné chyby oprávnění uživatele

Viz manuální .

Odpověď

Pro tyto úkoly vždy dělám: find / -iregex ".*Book1.*"

Tento formulář by se postaral o 3 body vašeho scénáře (iregex je racionální výraz bez rozlišování malých a velkých písmen a vzor s .* na obou stranách by se shodoval s jakýmkoli znakem před a po vašem pevném vzoru Book1 – to by vám samozřejmě mohlo vrátit více výsledků, než je nutné, ale soubor určitě nezmeškáte)

Hlavní rozdíl: pokud je to možné, buďte přísnější než pouhé použití /, jako byste zkoušeli pouze /home, jinak sestoupíte do některých adresářů, které nejsou relevantní (/sys, /dev atd.)

Nezapomeňte však, že Unix permissi platí: pokud je soubor v adresáři, pro který nemá uživatel spuštěný příkaz find právo přístupu (provést), find bude nemůžu to tam najít.

Komentáře

  • iregex nebude ‚ pracovat na místech jako Solaris (OS nebyl zadán) (a možná * BSD), jedná se o rozšíření GNU a není součástí standardu find

Odpověď

Silver Searcher je velmi rychlý a praktický nástroj pro vyhledávání souborů a obsahu.

Chcete-li vyřešit tento problém, příkaz Silver Searcher bude vypadat takto …

ag -g Book1

-g PATTERN Tisknout názvy souborů odpovídající PATTERN

Odpovědět

locate a jeho varianty bývají rychlou metodou.

# 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 

Pokud vyhledejte není avai štítku, můžete místo toho použít find. Bývá to mnohem pomalejší, ale také mnohem přesnější.

Pokud máte jeden oddíl: (spusťte jako root, pokud váš uživatel nemá přístup k souboru)

$ 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 

Pokud nezadáte -xdev find prohledá věci v jiných oddílech, například /proc a /sys, které zaplavují obrazovku chybami, zejména pokud nejste root.(Chyby lze skrýt přidáním 2> /dev/null na konec příkazu find (komentář by měl být odstraněn))

Pokud máte více oddílů a nemáte “ Pokud nevíte, na kterém souboru je soubor, můžete získat seznam s lsblk (v operačních systémech Linux je analýza df výstupu možnost jinak) a vložte jej do find: (znovu rootujte, pokud nevíte, zda máte přístup k souboru)

$ 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. 

(Toto je trochu křehký, pokud některý z vašich přípojných bodů má mezery) (df parametry mohou vyžadovat vyladění. -P udělá GNU df standardní výstup POSIX. jiné verze mohou mít jiné parametry nebo je třeba je vynechat. Přečtěte si svoji manuálovou stránku)

grep -F vylučuje další vrácené věci, například vyměnit oddíly.

Ve verzi jiné než GNU awk vyhledejte zařízení s připojením začínajícím /dev, abyste získali skutečné souborové systémy, a poté vytiskněte poslední pole d (přípojný bod) z výstupu df.

Předpokládá se také prostředí podobné prostředí (ksh a bash by měl fungovat. Pokud používáte csh variantu, spusťte skriptovatelný shell , než to vyzkoušíte)

Komentáře

  • Složky grep mohou být trochu hlučné, naučit se to filtrovat lepší (u příkladu by to nemělo být nutné, ale pokud se hledá něco běžnějšího, grepy potřeboval by vyladění, aby udržel nízkou hladinu hluku)

odpověď

ag (stříbrný vyhledávač) poskytuje velmi rychlé vyhledávání v souborech a má také možnost vyhledat název souboru:

>: 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 

Takže v mém případě použití je to> s> 30krát rychlejší, pokud soubor není soubor ignorovaný ag.

Odpověď

find / -type f -iname "book[0-9].*" 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *