2009-03-18 17 views
30

In editor/ides come eclissi e textmate, esistono scorciatoie per trovare rapidamente un determinato file in una directory di progetto.Trova file nella directory dalla riga di comando

Esiste uno strumento simile per eseguire il completamento completo del percorso sui nomi di file all'interno di una directory (in modo ricorsivo), in bash o in un'altra shell?

Ho progetti con molte directory e profonde in questo (sigh, java). scheda Colpire nel guscio solo cicli thru i file nella directory immediato, quello non è abbastanza =/

+0

Possibile duplicato di [Come trovare tutti i file contenenti testo specifico su Linux?] (Https://stackoverflow.com/questions/16956810/how-do-i-find-all-files-contain-specific-text -on-linux) – Bruno

risposta

53
find /root/directory/to/search -name 'filename.*' 
# Directory is optional (defaults to cwd) 

standard UNIX globbing è supportato. Vedere man find per ulteriori informazioni.

Se stai usando Vim, è possibile utilizzare:

:e **/filename.cpp 

O :tabn o qualsiasi comando Vim che accetta un nome di file.

+0

@Bryan Oakley, Grazie per la modifica, ma ha sovrascritto la mia aggiunta su Vim! Ho riformulato l'argomento della directory nella mia risposta. Grazie. – strager

+0

Grazie per il consiglio vim. Questo è uno di quelli che ancora non sapevo: P – skinp

+1

C'è comunque qualcosa da fare nella directory corrente senza doverlo digitare fino in fondo? –

0

Sì, bash ha meccanismi di completamento del nome file. Non li uso personalmente (troppo pigro per imparare, e non lo trovo necessario abbastanza spesso per renderlo urgente), ma il meccanismo di base è di digitare i primi caratteri, e poi una scheda; questo estenderà il nome il più lontano possibile (forse non del tutto) purché il nome non sia ambiguo. Ci sono una nave carica di comandi in stile Emacs relativi al completamento nella pagina di buon vecchio man.

2

Quando ero nel mondo UNIX (usando tcsh (sigh ...)), avevo sempre un set di alias/script per trovare i file. Credo che il default "trovare" la sintassi è un po 'goffo, così ho usato per avere alias/script per tubo nel grep, che permette di utilizzare le espressioni regolari per la ricerca "trovano -print.":

# finds all .java files starting in current directory 
find . -print | grep '\.java' 

#finds all .java files whose name contains "Message" 
find . -print | grep '.*Message.*\.java' 

Di Certo, gli esempi sopra possono essere fatti con la semplice ricerca, ma se hai una ricerca più specifica, grep può aiutare un bel po '. Funziona abbastanza bene, a meno che "find. -print" non abbia troppe directory da recitare attraverso ... poi diventa piuttosto lento. (per esempio, non vorrai farlo partendo da root "/")

7

Se stai cercando di fare qualcosa con un elenco di file, puoi usare find combinato con il costrutto bash $() (meglio di backtick poiché è consentito nidificare).

ad esempio, affermare che si è al livello più alto della directory del progetto e si desidera un elenco di tutti i file C che iniziano con "btree". Il comando:

find . -type f -name 'btree*.c' 

restituirà un elenco di essi. Ma questo non aiuta a fare qualcosa con loro.

Quindi, supponiamo inoltre di voler cercare tutti quei file per la stringa "ERRORE" o modificarli tutti. È possibile eseguire uno di:

grep ERROR $(find . -type f -name 'btree*.c') 
vi $(find . -type f -name 'btree*.c') 

per eseguire questa operazione.

1

Io uso questo script per trovare rapidamente i file tra le directory in un progetto.Ho trovato che funziona benissimo e sfrutta il completamento automatico di Vim aprendo e chiudendo un nuovo buffer per la ricerca. Inoltre, completa in modo intelligente il più possibile per te, quindi di solito puoi semplicemente digitare un carattere o due e aprire il file su qualsiasi directory del tuo progetto. Ho iniziato a usarlo specificamente a causa di un progetto Java e mi ha risparmiato un sacco di tempo. È sufficiente creare la cache una volta quando si avvia la sessione di modifica digitando: FC (nomi di directory). Puoi anche solo usare. per ottenere la directory corrente e tutte le sottodirectory. Dopo di che digiti semplicemente: FF (o FS per aprire una nuova divisione) e aprirà un nuovo buffer per selezionare il file che desideri. Dopo aver selezionato il file, il buffer temporaneo si chiude e si è all'interno del file richiesto e si può iniziare la modifica. Inoltre, here è un altro collegamento su Stack Overflow che può essere d'aiuto.

0

locate <file_pattern>

*** find sarà certamente lavorare, e possono indirizzare directory specifiche. Tuttavia, questo comando è più lento del comando locate. Su un sistema operativo Linux, ogni mattina viene creato un database che contiene un elenco di tutte le directory e i file e il comando locate ricerca in modo efficiente questo database, quindi se si desidera eseguire una ricerca per i file che non sono stati creati oggi, sarebbe il modo più veloce per svolgere tale compito.

Problemi correlati