Ricerca di file sorgente in un progetto
Usa un comando più semplice
Generalmente, è probabile che il codice sorgente di un progetto si trovi in un posto, forse in poche sottodirectory nidificate non più di due o tre profondità, quindi puoi usare un comando (possibilmente) più veloce come
(cd /path/to/project; ls *.c */*.c */*/*.c)
Utilizza i metadati del progetto
In un progetto C in genere avresti un Makefile. In altri progetti potresti avere qualcosa di simile. Questi possono essere un modo veloce per estrarre un elenco di file (e le loro posizioni) scrivere uno script che utilizza queste informazioni per individuare i file. Ho uno script "sources" in modo da poter scrivere comandi come grep variable $(sources programname)
.
Velocità della ricerca
Cerca meno posti, invece di find / …
usa find /path/to/project …
dove possibile. Semplifica il più possibile i criteri di selezione. Utilizza le pipeline per rinviare alcuni criteri di selezione se ciò è più efficiente.
Inoltre, puoi limitare la profondità della ricerca. Per me, questo migliora molto la velocità di "trova". Puoi usare l'opzione -maxdepth. Ad esempio '-maxdepth 5'
Velocità della localizzazione
Assicurati che stia indicizzando le posizioni che ti interessano. Leggi la pagina man e utilizza tutte le opzioni appropriate per il tuo compito.
-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.
Elimina la necessità di cercare
Forse stai cercando perché hai dimenticato dov'è qualcosa o non ti è stato detto. Nel primo caso scrivi note (documentazione), nel secondo chiedi? Convenzioni, standard e coerenza possono aiutare molto.
Ho usato la parte "accelerare l'individuazione" della risposta di RedGrittyBrick. Ho creato un db più piccolo:
updatedb -o /home/benhsu/ben.db -U /home/benhsu/ -e "uninteresting/directory1 uninteresting/directory2"
poi puntò locate
in esso:locate -d /home/benhsu/ben.db
Una tattica che utilizzo è applicare il -maxdepth
opzione con find
:
find -maxdepth 1 -iname "*target*"
Ripeti con profondità crescenti finché non trovi ciò che stai cercando o ti stanchi di cercare. È probabile che le prime iterazioni ritornino istantaneamente.
Questo ti assicura di non perdere tempo a guardare attraverso le profondità di enormi sotto-alberi quando è più probabile che ciò che stai cercando sia vicino alla base della gerarchia.
Ecco uno script di esempio per automatizzare questo processo (Ctrl-C quando vedi quello che vuoi):
(
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
)
Tieni presente che la ridondanza intrinseca coinvolta (ogni passaggio dovrà attraversare le cartelle elaborate nei passaggi precedenti) sarà in gran parte ottimizzata tramite la memorizzazione nella cache del disco.
Perché find
non funziona hai questo ordine di ricerca come funzione integrata? Forse perché sarebbe complicato/impossibile da implementare se si presumesse che l'attraversamento ridondante fosse inaccettabile. L'esistenza di -depth
option accenna alla possibilità, ma ahimè...