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:
- Přípona souboru není známa.
- Přesný název (tj. velká písmena, číslice atd.) není znám.
- umístění souboru není známo
Komentáře
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 𝗄
, 𝚔
, 𝘬
, ᵏ
, ₖ
, K
, k
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].*"
Book1
a nachází se v adresáři, který si můžete přečíst, afind / -iname book1
jej najde. Opravdu jsteBook1
a neBook1.xyz
?find
alocate
.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 vls
. Pravděpodobně myslíteiname '*book1*'
. Pamatujte, že vzor musí být uvnitř uvozovek, aby ho shell nerozbalil, než hofind
uvidí. Všimněte si také, žefind
je stejně jako mnoho příkazů * nix frustrující, když je neúspěšný.