Igyekszem egy könyv1 nevű fájlt keresni div id = “0a7b98f69d”>
.
A tesztem során megpróbálom megkeresni a fent említett fájlt, és ebben a tesztben nem tudom, hol található az a fájl.
Megpróbáltam a find / -iname book1
fájlt, de nincs kimenet.
Hogyan találom meg a book1 nevű fájlt a parancssor segítségével, ha nem tudom hol található a fájl?
SZERKESZTÉS:
A forgatókönyvem le van írva alább:
- A fájlkiterjesztés ismeretlen
- A pontos név (azaz nagybetűk, számok stb.) ismeretlen
- A a fájl helye ismeretlen
Megjegyzések
Válasz
Először is a -iname
argumentum egy shell minta . A mintákról a Bash kézikönyvben olvashat bővebben. A lényeg az, hogy ahhoz, hogy a find
valóban megtaláljon egy fájlt, a fájlnévnek meg kell egyeznie a megadott mintával. A kis- és nagybetűk nélküli karakterlánc book1
egyezés Book1.gnumeric
létrehozásához vagy hozzá kell adnia a *
így néz ki:
find / -iname "book1*"
vagy adja meg a teljes nevet:
find / -iname "Book1.gnumeric"
Második , -iname
a find
figyelmen kívül hagyja a fájlnév esetét, így ha megadja az -iname book1
lehetőséget, akkor Book1
, bOok1
keresés stb. Ha biztos benne, hogy a keresett fájl neve Book1.gnumeric
akkor ne használja -iname
, hanem -name
, gyorsabb lesz:
find / -name "Book1.gnumeric"
Harmadszor, ne felejtse el idézni a mintát a másik válaszban leírtak szerint.
És utoljára – vannak biztos benne, hogy a fájlt mindenhol meg akarja keresni a rendszerén? Lehetséges, hogy a keresett fájl valójában a $HOME
könyvtár, ha ezen dolgoztál, vagy letöltötted valahonnan. Ez megint sokkal gyorsabb lehet.
SZERKESZTÉS :
Észrevettem hogy szerkesztette a kérdését. Ha nem ismeri a teljes fájlnevet, nagybetűket és helyet, akkor valóban valami ilyesmit kell használnia:
find / -iname "book1*"
Azt is javaslom, hogy a 2>/dev/null
a sor végén, hogy elrejtse az összes *permission denied*
és egyéb hibát, amelyek jelen lehetnek, ha a find
nem root felhasználó:
find / -iname "book1*" 2>/dev/null
És ha biztos abban, hogy egyetlen fájlt keres, és csak egyetlen fájl van a A kritériumoknak megfelelő rendszert megadhat a find
parancsnak, hogy lépjen ki az első megfelelő fájl megtalálása után:
find / -iname "book1*" -print -quit 2>/dev/null
megjegyzések
Válasz
Megpróbálhatja a locate
parancsot. A fájlnevek adatbázisát használja hogy gyorsabb legyen a keresés.
Az összes olyan fájl kereséséhez, amely megfelel *book1*
, és figyelmen kívül hagyja a kis- és nagybetűket, használhatja a
locate -i book1
ha fájlokat szeretne keresni kezdve book1
betűvel, akkor a helyettesítő karaktert magának kell megtennie:
locate -i "book1*"
Sokkal gyorsabb, mint a find
, de csak annyira naprakész, mint az adatbázis legutóbbi frissítésekor.
Megjegyzések
- Ezek egyike sem eredményezett számomra kimenetet:
locate -i after.sh
,sudo locate -i "after.sh"
,sudo locate -i after.sh
,sudo locate -i '*after.sh'
Válasz
Ha tudja, hogy van egy book1.something
nevű fájlja, ahol a fájl helye, a something
pontos értéke , és a fájlnév nagybetűs mintája mind ismeretlen:
find / -iname "book1.*"
Ha csak annyit tud, hogy a fájlnév tartalmazza az , valószínűleg sokkal nagyobb listát hozhat létre a
find / -iname "*book*"
A -name
egy shell glob minta. A fájl könyvtárából hasonlítsa össze:
$ ls Book1 ls: cannot access "Book1": No such file or directory $ ls Book1.* Book1.gnumeric
Ez a -name
által végzett keresést jelöli. A -iname
opció egyszerűen lehetővé teszi ennek kis- és nagybetűk nélküli változatát.
Válasz
POSIXly,
LC_ALL=C find / -name "*[bB][oO][oO][kK]1*"
Jelzi az összes fájl útvonalát, amelyek neve book1
-t tartalmaz (az eset esetleges változataival) , de csak az ASCII latin karaktereket bokBOK
figyelembe véve, az Unicode számos más variációját nem, például a 𝗄
, 𝚔
, 𝘬
, ᵏ
, ₖ
, K
, k
és azok összes változata diakritikusokkal …) minden könyvtárban, amelyhez olvasási hozzáférést élvez.
Válasz
A Zsh segítségével globális mintákat használhat, így ez is működik:
ls -a /**/book1
Ez keresse meg az összes helyet, ahol egy book1
nevű fájl él.
A tesztelésem során ez gyorsabbnak tűnik, mint a find
, és kevés vagy egyáltalán nem hoz létre felhasználói engedély hibákat , ha root jogosultság nélkül futtatják
Lásd: kézi .
Válasz
Az ilyen típusú feladatokhoz mindig: find / -iregex ".*Book1.*"
Ez az űrlap gondoskodik a forgatókönyv 3 pontjáról (iregex
kis- és nagybetűkkel nem értelmezhető racionális kifejezés, és a Mindkét oldalon található .*
minden karakterhez illeszkedne a Book1 fix mintája előtt és után – ez nyilvánvalóan több eredményt adhat vissza a szükségesnél, de biztos, hogy nem hagyja ki a fájlt)
A fő különbség: ha lehetséges, legyen szigorúbb, mint pusztán a /
használata, például csak /home
próbálkozás, különben néhány nem releváns könyvtárban ereszkedik le (/sys
, /dev
stb.)
Ne feledje azonban, hogy Unix permissi érvényesek: ha a fájl egy könyvtárban van, amelyhez a find
parancsot futtató felhasználónak nincs hozzáférési (végrehajtási) joga, akkor a find
nem találja ott.
Megjegyzések
- az iregex nem fog ‘ dolgozni olyan helyeken, mint például Solaris (az operációs rendszer nem volt megadva) (és esetleg * BSD), ez egy GNU kiterjesztés, és nem része a szabványnak
find
Válasz
Ezüst kereső nagyon gyors és praktikus alkalmazás fájlok és tartalmak keresésére.
A probléma megoldása érdekében az ezüst kereső parancs így néz ki …
ag -g Book1
-g PATTERN
PATTERN-nek megfelelő fájlnevek nyomtatása
Válasz
locate
és változatai általában gyors módszerek.
# 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
Ha megkeresi nem avai Használható helyette a find
. Ez általában sokkal lassabb, de sokkal pontosabb is.
Ha egyetlen partíciója van: (futtassa rootként, ha a felhasználó nem férhet hozzá a fájlhoz)
$ 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
Ha nem tartalmazza a -xdev
find
elemeket, akkor más partíciókon keres dolgokat, például /proc
és /sys
, amelyek általában hibákat árasztanak el a képernyőn, különösen, ha nem root vagy.(A hibákat el lehet rejteni a 2> /dev/null
fájl hozzáadásával a find parancs végén (a megjegyzést el kell távolítani))
Ha több partíciója van, és nem használ ” Nem tudom, melyik fájlon van, megkaphatja a lsblk
listát (Linux alapú operációs rendszereken a df
kimenet elemzése egy opció különben), és táplálja be a find: (root-ba, ha nem tudja, hogy hozzáfér-e a fájlhoz)
$ 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.
(Ez egy kicsit törékeny, ha bármelyik csatlakozási pontodnál van szóköz) előfordulhat, hogy a verzióknak vannak más paramétereik, vagy ki kell hagyni őket. Olvassa el a man oldalt)
A grep -F
kizár minden egyéb visszaküldött dolgot, például a partíciók cseréjét.
A nem GNU verzióban az awk /dev
kezdetű csatolással rendelkező eszközöket talál valódi fájlrendszerek megszerzéséhez, majd az utolsó fájl kinyomtatásához d (a csatlakoztatási pont) a df
kimenetből.
Ez feltételez egy bourne-szerű héjat is (ksh
és A bash
működnie kell. Ha csh
változatot használ, indítsa el a szkriptelhető héjat , mielőtt ezt megpróbálja)
Megjegyzések
- A
grep
s kissé zajos lehet, megtanulhatja, hogyan szűrje jobban (erre nincs szükség a példánál, de ha valami általánosabbat keres, a greps hangolásra lenne szükség a zajszint csökkentése érdekében)
Válasz
ag (ezüst kereső) nagyon gyors keresést biztosít a fájlokban, és lehetősége van a fájlnév keresésére is:
>: 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
Tehát az én esetemben itt> 30-szor gyorsabb, ha a fájl nem az ag által figyelmen kívül hagyott fájl.
Válasz
find / -type f -iname "book[0-9].*"
Book1
, és egy olyan könyvtárban található, amelyet el tud olvasni, majd afind / -iname book1
megtalálja. Biztos benne, hogy valójábanBook1
, és nemBook1.xyz
?find
és alocate
keveréket. Alocate
nagylelkű, és mindent megtalál, ami megfelel, mindaddig, amíg az az adatbázisában található, amelyet általában naponta frissítenek. Ebben az esetben afind
fájlgömböt keres, azt a fajta mintát, amelyet als
fájlban használna. Valószínűleginame '*book1*'
-re gondol. Vegye figyelembe, hogy a mintának idézőjelek között kell lennie, hogy megakadályozza a héj kibővítését, mielőtt afind
meglátná. Vegye figyelembe azt is, hogy afind
, mint sok * nix parancs, sikertelenül elkeserítően hallgat.