GNU/Linux >> Znalost Linux >  >> Linux

Rychlejší alternativy k nalezení a lokalizaci?

Vyhledávání zdrojových souborů v projektu

Použijte jednodušší příkaz

Obecně je zdroj pro projekt pravděpodobně na jednom místě, možná v několika podadresářích vnořených ne více než dva nebo tři hluboko, takže můžete použít (možná) rychlejší příkaz, jako je

(cd /path/to/project; ls *.c */*.c */*/*.c)

Využijte metadata projektu

V projektu C byste obvykle měli Makefile. V jiných projektech můžete mít něco podobného. Mohou to být rychlý způsob, jak extrahovat seznam souborů (a jejich umístění), napsat skript, který tyto informace využije k vyhledání souborů. Mám skript "zdroje", takže mohu psát příkazy jako grep variable $(sources programname) .

Urychlení hledání

Hledejte méně míst místo find / … použijte find /path/to/project … kde je to možné. Co nejvíce zjednodušte kritéria výběru. Pokud je to efektivnější, použijte kanály k odložení některých kritérií výběru.

Můžete také omezit hloubku vyhledávání. Pro mě to hodně zlepšuje rychlost 'najít'. Můžete použít přepínač -maxdepth. Například '-maxdepth 5'

Zrychlení lokalizace

Ujistěte se, že indexuje umístění, která vás zajímají. Přečtěte si manuálovou stránku a použijte jakékoli možnosti, které jsou vhodné pro váš úkol.

   -U <dir>
          Create slocate database starting at path <dir>.

   -d <path>
          --database=<path> Specifies the path of databases to search  in.


   -l <level>
          Security  level.   0  turns  security checks off. This will make
          searchs faster.   1  turns  security  checks  on.  This  is  the
          default.

Odstraňte potřebu hledání

Možná hledáte, protože jste zapomněli, kde co je nebo nebylo řečeno. V prvním případě pište poznámky (dokumentaci), v druhém se ptejte? Konvence, standardy a konzistence mohou hodně pomoci.


Použil jsem část „zrychlení lokalizace“ v odpovědi RedGrittyBrick. Vytvořil jsem menší db:

updatedb -o /home/benhsu/ben.db -U /home/benhsu/ -e "uninteresting/directory1 uninteresting/directory2"

pak ukázal locate na to:locate -d /home/benhsu/ben.db


Taktika, kterou používám, je použít -maxdepth možnost s find :

find -maxdepth 1 -iname "*target*"

Opakujte s narůstající hloubkou, dokud nenajdete, co hledáte, nebo vás hledání omrzí. Prvních několik iterací se pravděpodobně vrátí okamžitě.

To zajišťuje, že nebudete ztrácet čas předem prohlížením hlubin mohutných podstromů, když to, co hledáte, je pravděpodobněji blízko základny hierarchie.

Zde je příklad skriptu pro automatizaci tohoto procesu (Ctrl-C, když vidíte, co chcete):

(
TARGET="*target*"
for i in $(seq 1 9) ; do
   echo "=== search depth: $i"
   find -mindepth $i -maxdepth $i -iname "$TARGET"
done
echo "=== search depth: 10+"
find -mindepth 10 -iname $TARGET
)

Všimněte si, že související redundance (každý průchod bude muset projít složkami zpracovanými v předchozích průchodech) bude z velké části optimalizován pomocí ukládání do mezipaměti disku.

Proč ne find mají toto pořadí vyhledávání jako vestavěnou funkci? Možná proto, že by to bylo komplikované/nemožné implementovat, pokud byste předpokládali, že redundantní procházení je nepřijatelné. Existence -depth možnost naznačuje možnost, ale bohužel...


Linux
  1. Jak najít soubor v Linuxu

  2. Alternativy Pgrep a Pkill na Mac OS X?

  3. Najít vzor a přesunout?

  1. Použít příkaz Grep a vyhledat?

  2. Najděte a zkopírujte soubory

  3. Jak prohledám adresáře a najdu soubory, které odpovídají regulárnímu výrazu?

  1. Vyhledávání duplicitních názvů souborů bez ohledu na velikost písmen?

  2. Jak hledat soubory podle velikosti a přípony?

  3. Jaký je rozdíl mezi „vyhledat“ a „najít“ v Linuxu?