Fájlok megkeresése bármelyik könyvtárból

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:

  1. A fájlkiterjesztés ismeretlen
  2. A pontos név (azaz nagybetűk, számok stb.) ismeretlen
  3. A a fájl helye ismeretlen

Megjegyzések

  • Ha létezik Book1, és egy olyan könyvtárban található, amelyet el tud olvasni, majd a find / -iname book1 megtalálja. Biztos benne, hogy valójában Book1, és nem Book1.xyz?
  • A fájl teljes neve Book1. gnumerikus. Azt akarja mondani, hogy meg kell adnom a fájl teljes nevét? Valamilyen oknál fogva azt gondoltam, hogy ehhez a speciális parancshoz csak a fájl általános nevére van szükségem ‘. A tesztem egy fájlt próbál keresni, ha például nem emlékszem ‘ nem emlékszem a fájlkiterjesztésre, és csak a fájl nevét tudom I ‘ m keres. Kérjük, adjon tanácsot.
  • @don_crissti Kész. Kérjük, olvassa el a fenti Szerkesztés részt.
  • Keveri a find és a locate keveréket. A locate 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 a find fájlgömböt keres, azt a fajta mintát, amelyet a ls fájlban használna. Valószínűleg iname '*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 a find meglátná. Vegye figyelembe azt is, hogy a find, mint sok * nix parancs, sikertelenül elkeserítően hallgat.

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük