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
greps 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 book1megtalálja. Biztos benne, hogy valójábanBook1, és nemBook1.xyz?findés alocatekeveréket. Alocatenagylelkű, é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 afindfájlgömböt keres, azt a fajta mintát, amelyet alsfá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 afindmeglátná. Vegye figyelembe azt is, hogy afind, mint sok * nix parancs, sikertelenül elkeserítően hallgat.