Come posso ottenere `find` per ignorare le directory .svn?


227

Uso spesso il findcomando per cercare nel codice sorgente, eliminare i file, qualunque cosa. Stranamente, poiché Subversion memorizza i duplicati di ogni file nelle sue .svn/text-base/directory, le mie semplici ricerche finiscono per ottenere molti risultati duplicati. Ad esempio, voglio cercare ricorsivamente uintin più messages.he messages.cppfile:

# find -name 'messages.*' -exec grep -Iw uint {} +
./messages.cpp:            Log::verbose << "Discarding out of date message: id " << uint(olderMessage.id)
./messages.cpp:    Log::verbose << "Added to send queue: " << *message << ": id " << uint(preparedMessage->id)
./messages.cpp:                Log::error << "Received message with invalid SHA-1 hash: id " << uint(incomingMessage.id)
./messages.cpp:            Log::verbose << "Received " << *message << ": id " << uint(incomingMessage.id)
./messages.cpp:            Log::verbose << "Sent message: id " << uint(preparedMessage->id)
./messages.cpp:        Log::verbose << "Discarding unsent message: id " << uint(preparedMessage->id)
./messages.cpp:        for (uint i = 0; i < 10 && !_stopThreads; ++i) {
./.svn/text-base/messages.cpp.svn-base:            Log::verbose << "Discarding out of date message: id " << uint(olderMessage.id)
./.svn/text-base/messages.cpp.svn-base:    Log::verbose << "Added to send queue: " << *message << ": id " << uint(preparedMessage->id)
./.svn/text-base/messages.cpp.svn-base:                Log::error << "Received message with invalid SHA-1 hash: id " << uint(incomingMessage.id)
./.svn/text-base/messages.cpp.svn-base:            Log::verbose << "Received " << *message << ": id " << uint(incomingMessage.id)
./.svn/text-base/messages.cpp.svn-base:            Log::verbose << "Sent message: id " << uint(preparedMessage->id)
./.svn/text-base/messages.cpp.svn-base:        Log::verbose << "Discarding unsent message: id " << uint(preparedMessage->id)
./.svn/text-base/messages.cpp.svn-base:        for (uint i = 0; i < 10 && !_stopThreads; ++i) {
./virus/messages.cpp:void VsMessageProcessor::_progress(const string &fileName, uint scanCount)
./virus/messages.cpp:ProgressMessage::ProgressMessage(const string &fileName, uint scanCount)
./virus/messages.h:    void _progress(const std::string &fileName, uint scanCount);
./virus/messages.h:    ProgressMessage(const std::string &fileName, uint scanCount);
./virus/messages.h:    uint        _scanCount;
./virus/.svn/text-base/messages.cpp.svn-base:void VsMessageProcessor::_progress(const string &fileName, uint scanCount)
./virus/.svn/text-base/messages.cpp.svn-base:ProgressMessage::ProgressMessage(const string &fileName, uint scanCount)
./virus/.svn/text-base/messages.h.svn-base:    void _progress(const std::string &fileName, uint scanCount);
./virus/.svn/text-base/messages.h.svn-base:    ProgressMessage(const std::string &fileName, uint scanCount);
./virus/.svn/text-base/messages.h.svn-base:    uint        _scanCount;

Come posso dire finddi ignorare le .svndirectory?


Aggiornamento : se aggiorni il tuo client SVN alla versione 1.7 questo non è più un problema.

Una caratteristica chiave delle modifiche introdotte in Subversion 1.7 è la centralizzazione dell'archiviazione dei metadati di copia funzionante in un'unica posizione. Invece di una .svndirectory in ogni directory nella copia di lavoro, le copie di lavoro di Subversion 1.7 hanno solo una .svndirectory nella radice della copia di lavoro. Questa directory include (tra le altre cose) un database supportato da SQLite che contiene tutti i metadati necessari a Subversion per quella copia di lavoro.


4
Per prestazioni, prova a utilizzare find ... -print0 | xargs -0 egrep ...invece di find ... -exec grep ...(non fork grepper ogni file, ma per un mucchio di file alla volta). Usando questo modulo puoi anche eliminare le .svndirectory senza usare l' -pruneopzione find, ovverofind ... -print0 | egrep -v '/\.svn' | xargs -0 egrep ...
vladr

3
@Vlad: Per quanto ne so, usare -execwith +non fa fork grepper ogni file, mentre lo usa con ;does. L'uso -execè in realtà più corretto dell'uso xargs. Si noti che comandi come lsfanno qualcosa anche se l'elenco degli argomenti è vuoto, mentre comandi come chmoddanno un errore se non ci sono argomenti sufficienti. Per capire cosa intendo, basta provare il seguente comando in una directory che non ha alcuna script di shell: find /path/to/dir -name '*.sh' -print0 | xargs -0 chmod 755. Confrontare con questo: find /path/to/dir -name '*.sh' -exec chmod 755 '{}' '+'.
Siu Ching Pong -Asuka Kenji-

2
@Vlad: Inoltre, grepuscire .svnnon è una buona idea. Mentre findè specializzato per la gestione delle proprietà dei file, grepnon lo è. Nel tuo esempio, anche un file chiamato ".svn.txt" verrà filtrato dal tuo egrepcomando. Sebbene sia possibile modificare il regex in '^ / \. Svn $' , non è comunque una buona pratica farlo. Il -prunepredicato di findfunziona perfettamente per filtrare un file (per nome file, timestamp di creazione o qualunque condizione fornita). È come se anche tu potessi uccidere uno scarafaggio usando una grande spada non significa che sia il modo suggerito per farlo :-).
Siu Ching Pong -Asuka Kenji-

3
Il passaggio a Git ha risolto questo problema (tra molti altri). Crea solo una cartella .git sulla radice della copia di lavoro, non in tutte le cartelle come SVN. Inoltre, la cartella .git non contiene file semplici che potrebbero essere confusi con i file effettivi con gli stessi nomi.
Tronic,

3
2Dan Molding: svn 1.7 crea solo una singola directory .svn di primo livello
ccpizza

Risposte:


65

Per la ricerca, posso suggerirti di guardare ack ? È a conoscenza del codice sorgente finde come tale ignorerà automaticamente molti tipi di file, incluse le informazioni sul repository del codice sorgente come quelle sopra.


3
Mi piace ackmolto, ma l'ho trovato sostanzialmente più lento rispetto a find -type f -name "*.[ch]" | xargs grepquando si tratta di una base di codice di grandi dimensioni.
John Ledbetter,

63
John, sono l'autore di ack, e se puoi darmi dettagli sui problemi di velocità di ack vs grep, lo apprezzerei. Sono stati completamente comparabili in tutti i casi che ho trovato. Fammi sapere a github.com/petdance/ack/issues o inviami un'e-mail a andy su petdance.com. Thansk.
Andy Lester,

63
Ragazzi, questo è un consiglio, ma sicuramente non è una risposta alla domanda! :)
dolzenko,

8
La ackfatturazione non è migliore grep, non consapevole delle fonti find? Alcuni esempi di utilizzo per sostituirlo findrenderebbero questa una vera risposta.
michiakig,

3
È una risposta alla domanda che non sapeva di porre. =)
Frungi

293

perché non solo

find . -not -iwholename '*.svn*'

Il predicato -not nega tutto ciò che ha .svn in qualsiasi punto del percorso.

Quindi nel tuo caso lo sarebbe

find -not -iwholename '*.svn*' -name 'messages.*' -exec grep -Iw uint {} + \;

5
Super grande +1 per "-not" e "-iwholename". Ack è meraviglioso e lo uso, ma find / exec ha ancora i suoi usi.
David Blevins,

9
L'unica risposta che ha effettivamente risposto alla domanda originale.
Brendon Crawford,

14
Sono fuori dal mio elemento e sono sicuro di essere criticato per questo commento, ma apparentemente -not e -wholename non sono conformi a POSIX. Ero solito ! al posto di -not e -path al posto di -iwholename e ha ottenuto gli stessi risultati. Secondo le mie pagine man (Ubuntu 12.04) questa sintassi è conforme a POSIX.
Giovanni

1
@whaley All'inizio hai detto '*.svn*'ma poi '*.svn'. Quale è giusto? Entrambi funzionano? Penso che dovrebbe essere probabilmente '*.svn*'?
Keith M,

1
@KeithM ottima cattura in realtà. Questa risposta è stata seduta qui per anni e non credo che qualcuno l'abbia colta fino ad ora.
Whaley,

141

Come segue:

find . -path '*/.svn*' -prune -o -print

Oppure, in base a una directory e non a un prefisso percorso:

find . -name .svn -a -type d -prune -o -print

14
@Kaleb: Ciao. Suggerisco find . -type d -name .svn -prune -o -printperché è un po 'più veloce. Secondo lo standard POSIX , le espressioni vengono valutate una per una, nell'ordine specificato. Se la prima espressione -aè false, la seconda espressione non verrà valutata (chiamata anche cortocircuito e valutazione ).
Siu Ching Pong -Asuka Kenji-

2
@Kaleb: Come confrontare il tipo di file (equivalente a testare se un po 'si trova in un intero) è più veloce rispetto confrontando il nome del file (equivalente a un confronto di stringhe, che è O (n)), mettendo -type dprima -name .svnè teoricamente più efficiente. Tuttavia, di solito è insignificante, tranne se si dispone di un albero di directory molto grande.
Siu Ching Pong -Asuka Kenji-

5
@ SiuChingPong-AsukaKenji- no, confrontando solo il nome del file è più veloce perché -type richiede una chiamata stat (2) su ogni file. Il nome file, tuttavia, fa parte della risposta readdir (3).
hraban,

3
@JonathanHartley Ti manca il -printcome parte dell'ultima espressione. Qualcosa come find . -name .git -prune -o \( -type f -name LICENSE -print \)funziona come previsto.
sschuberth,

1
Se si desidera ignorare sia .git e .svn e basta elencare le altre directory, find . -name .svn -prune -o -name .git -prune -o -type d -print. Potrebbe essere qualche millisecondo più veloce mettendo -type dprima i due -name, ma non vale la digitazione extra.
JPaget,

34

Per ignorare .svn, .gite altre directory nascosti (che iniziano con un punto), provare:

find . -type f -not -path '*/\.*'

Tuttavia, se lo scopo dell'utilizzo findè la ricerca all'interno dei file, è possibile provare a utilizzare questi comandi:

  • git grep - comando appositamente progettato per la ricerca di schemi all'interno del repository Git.
  • ripgrep- che per impostazione predefinita ignora i file nascosti e i file specificati in .gitignore.

Correlati: Come posso trovare tutti i file contenenti testo specifico su Linux?


Migliore risposta imo. Gli altri cercano di spiegare cose che non rispondono alla semplice domanda.
Anthony,

19

Ecco cosa farei nel tuo caso:

find . -path .svn -prune -o -name messages.* -exec grep -Iw uint {} +

Il rgrepcomando integrato di Emacs ignora la .svndirectory e molti altri file che probabilmente non ti interessano quando esegui un file find | grep. Ecco cosa utilizza per impostazione predefinita:

find . \( -path \*/SCCS -o -path \*/RCS -o -path \*/CVS -o -path \*/MCVS \
          -o -path \*/.svn -o -path \*/.git -o -path \*/.hg -o -path \*/.bzr \
          -o -path \*/_MTN -o -path \*/_darcs -o -path \*/\{arch\} \) \
     -prune -o \
       \( -name .\#\* -o -name \*.o -o -name \*\~ -o -name \*.bin -o -name \*.lbin \
          -o -name \*.so -o -name \*.a -o -name \*.ln -o -name \*.blg \
          -o -name \*.bbl -o -name \*.elc -o -name \*.lof -o -name \*.glo \
          -o -name \*.idx -o -name \*.lot -o -name \*.fmt -o -name \*.tfm \
          -o -name \*.class -o -name \*.fas -o -name \*.lib -o -name \*.mem \
          -o -name \*.x86f -o -name \*.sparcf -o -name \*.fasl -o -name \*.ufsl \
          -o -name \*.fsl -o -name \*.dxl -o -name \*.pfsl -o -name \*.dfsl \
          -o -name \*.p64fsl -o -name \*.d64fsl -o -name \*.dx64fsl -o -name \*.lo \
          -o -name \*.la -o -name \*.gmo -o -name \*.mo -o -name \*.toc \
          -o -name \*.aux -o -name \*.cp -o -name \*.fn -o -name \*.ky \
          -o -name \*.pg -o -name \*.tp -o -name \*.vr -o -name \*.cps \
          -o -name \*.fns -o -name \*.kys -o -name \*.pgs -o -name \*.tps \
          -o -name \*.vrs -o -name \*.pyc -o -name \*.pyo \) \
     -prune -o \
     -type f \( -name pattern \) -print0 \
     | xargs -0 -e grep -i -nH -e regex

Ignora le directory create dalla maggior parte dei sistemi di controllo della versione, nonché i file generati per molti linguaggi di programmazione. È possibile creare un alias che richiama questo comando e sostituire finde grepschemi per i problemi specifici.


12

GNU find

find .  ! -regex ".*[/]\.svn[/]?.*"

Stavo caricando i percorsi delle directory in un array per l'elaborazione da parte di PHP. Le altre risposte più in alto (per qualsiasi motivo) non hanno filtrato i file nella ricerca (nonostante -type d) - questa risposta ha fatto. +1
essere hollenbeck il

11

Uso grep per questo scopo. Metti questo nel tuo ~ / .bashrc

export GREP_OPTIONS="--binary-files=without-match --color=auto --devices=skip --exclude-dir=CVS --exclude-dir=.libs --exclude-dir=.deps --exclude-dir=.svn"

grep utilizza automaticamente queste opzioni durante l'invocazione


1
Vale la pena notare che 'grep' ha ottenuto l'opzione '--exclude-dir' solo uno o due anni fa. Le recenti distribuzioni Linux lo includono, ma se ricordo bene dovevo compilare il mio grep (o chiedere a homebrew di farlo) su OSX.
Jonathan Hartley, l'

Uso una variante minore di questo. Il mio .bashrc crea una funzione Bash 'grp', che è definita come GREP_OPTIONS=xxx grep "$@". Ciò significa che la variabile GREP_OPTIONS è impostata solo per le istanze di grep che eseguo manualmente usando 'grp'. Ciò significa che non ho mai una situazione in cui eseguo uno strumento e internamente chiama grep, ma lo strumento viene confuso perché grep non si sta comportando come previsto. Inoltre, ho una seconda funzione 'grpy', che chiama 'grp', ma aggiunge --include=*.py, solo per cercare i file Python.
Jonathan Hartley l'

In realtà, a pensarci bene, a modo mio non è più necessario utilizzare GREP_OPTIONS. Ora ho solo una funzione shell 'grp' che chiama grep --exclude=tags --exclude_dir=.git ...etc... "$@". Mi piace che funzioni come 'ack', ma mantengo la consapevolezza e il controllo su ciò che sta facendo.
Jonathan Hartley,

9

find . | grep -v \.svn


Devi scappare .nella .svnregexp.
vladr

4
Usa --fixed-string con grep: | fgrep -v /.svn/o `| grep -F -v / .svn / `per escludere esattamente la directory e non i file con" .svn "come parte del loro nome.
Stephen P,

8

Perché non convogliare il tuo comando con grep che è facilmente comprensibile:

your find command| grep -v '\.svn'

Devi scappare .nella .svnregexp.
vladr

@Yclian senza ombra di dubbio; in caso contrario, le directory chiamate "tsvn", "1svn", "asvn" ecc. verranno anch'esse ignorate da "." è un jolly regexp: 'abbina qualsiasi carattere'.
Vladr,

Bene, ho pensato che sarebbe successo solo per il caso di -E e -G. Ho appena provato, mio ​​male. :(
yclian,

2
Mi piace questa risposta perché è concettualmente più semplice di tutte le altre. Non ricordo la ridicola sintassi per l'uso 'find', ma posso sicuramente ricordare come usare grep -v poiché è usato in moltissime situazioni.
mattismyname,

8

Crea uno script chiamato ~/bin/svnfind:

#!/bin/bash
#
# Attempts to behave identically to a plain `find' command while ignoring .svn/
# directories.

OPTIONS=()
PATHS=()
EXPR=()

while [[ $1 =~ ^-[HLP]+ ]]; do
    OPTIONS+=("$1")
    shift
done

while [[ $# -gt 0 ]] && ! [[ $1 =~ '^[-(),!]' ]]; do
    PATHS+=("$1")
    shift
done

# If user's expression contains no action then we'll add the normally-implied
# `-print'.
ACTION=-print

while [[ $# -gt 0 ]]; do
    case "$1" in
       -delete|-exec|-execdir|-fls|-fprint|-fprint0|-fprintf|-ok|-print|-okdir|-print0|-printf|-prune|-quit|-ls)
            ACTION=;;
    esac

    EXPR+=("$1")
    shift
done

if [[ ${#EXPR} -eq 0 ]]; then
    EXPR=(-true)
fi

exec -a "$(basename "$0")" find "${OPTIONS[@]}" "${PATHS[@]}" -name .svn -type d -prune -o '(' "${EXPR[@]}" ')' $ACTION

Questo script si comporta in modo identico a un semplice findcomando ma elimina le .svndirectory. Altrimenti il ​​comportamento è identico.

Esempio:

# svnfind -name 'messages.*' -exec grep -Iw uint {} +
./messages.cpp:            Log::verbose << "Discarding out of date message: id " << uint(olderMessage.id)
./messages.cpp:    Log::verbose << "Added to send queue: " << *message << ": id " << uint(preparedMessage->id)
./messages.cpp:                Log::error << "Received message with invalid SHA-1 hash: id " << uint(incomingMessage.id)
./messages.cpp:            Log::verbose << "Received " << *message << ": id " << uint(incomingMessage.id)
./messages.cpp:            Log::verbose << "Sent message: id " << uint(preparedMessage->id)
./messages.cpp:        Log::verbose << "Discarding unsent message: id " << uint(preparedMessage->id)
./messages.cpp:        for (uint i = 0; i < 10 && !_stopThreads; ++i) {
./virus/messages.cpp:void VsMessageProcessor::_progress(const string &fileName, uint scanCount)
./virus/messages.cpp:ProgressMessage::ProgressMessage(const string &fileName, uint scanCount)
./virus/messages.h:    void _progress(const std::string &fileName, uint scanCount);
./virus/messages.h:    ProgressMessage(const std::string &fileName, uint scanCount);
./virus/messages.h:    uint        _scanCount;

Questo script non funziona come mi aspetterei. Quando viene eseguito con "svnfind -type f", stampa anche le directory svn e i file nelle directory svn
Ingo Fischer

@ifischer Puoi aggiungere un echoal comando find e dirmi quale comando viene eseguito? svnfind -type ffunziona alla grande sulla mia macchina Red Hat.
John Kugelman,

Ok, quindi sembra dipendere dal sistema operativo. Sto eseguendo Debian Squeeze (è lo stesso su Ubuntu). Non capisco cosa intendi con "aggiungi un'eco"?
Ingo Fischer,

@ifischer Modifica l'ultima riga in echo find "${OPTIONS[@]}"...modo che stampi il comando find anziché eseguirlo effettivamente.
John Kugelman,

Ok ha cambiato l'ultima riga in echo find ${OPTIONS[@]} ${PATHS[@]} -name .svn -type d -prune -o ( ${EXPR[@]} ) $ACTION, Questo mi dà il seguente output:find -type f -name .svn -type d -prune -o ( -true ) -print
Ingo Fischer

5

Ho solo pensato di aggiungere una semplice alternativa ai post di Kaleb e di altri (che descrivevano in dettaglio l'uso find -prunedell'opzione ack, dei repofindcomandi , ecc.) Che è particolarmente applicabile all'uso che hai descritto nella domanda (e a qualsiasi altro utilizzo simile):

  1. Per le prestazioni, dovresti sempre provare a usare find ... -exec grep ... +(grazie Kenji per averlo sottolineato) o find ... | xargs egrep ...(portatile) o find ... -print0 | xargs -0 egrep ...(GNU; funziona su nomi di file contenenti spazi) invece di find ... -exec grep ... \;.

    Il form find ... -exec ... +e find | xargsnon si biforca egrepper ogni file, ma piuttosto per un mucchio di file alla volta, con conseguente esecuzione molto più veloce .

  2. Quando si utilizza il find | xargsmodulo è inoltre possibile utilizzare grepper potare facilmente e rapidamente .svn(o qualsiasi directory o espressione regolare), vale a dire find ... -print0 | grep -v '/\.svn' | xargs -0 egrep ...(utile quando è necessario qualcosa di rapido e non si può disturbare a ricordare come impostare findla -prunelogica.)

    L' find | grep | xargsapproccio è simile a GNU finds' -regexopzione (vedighostdog74 ' s post), ma è più portabile (funziona anche su piattaforme in cui GNU findnon è disponibile.)


1
@Vlad: Notare che esistono due moduli per il -execpassaggio find: uno termina con ;e l'altro termina con +. Quello che termina con viene +sostituito {}da un elenco di tutti i file corrispondenti. Inoltre, la tua regex '/\.svn'corrisponde anche a nomi di file '.svn.txt'. Si prega di fare riferimento ai miei commenti alla domanda per ulteriori informazioni.
Siu Ching Pong -Asuka Kenji-

2
@Vlad: ecco lo standard POSIX per l' findutilità. Si prega di vedere la -execparte :-).
Siu Ching Pong -Asuka Kenji-

4

In un repository di codice sorgente, generalmente voglio fare cose solo con i file di testo.

La prima riga contiene tutti i file, esclusi i file di repository CVS, SVN e GIT.

La seconda riga esclude tutti i file binari.

find . -not \( -name .svn -prune -o -name .git -prune -o -name CVS -prune \) -type f -print0 | \
xargs -0 file -n | grep -v binary | cut -d ":" -f1

3

Uso find con le opzioni -not -path. Non ho avuto fortuna con la prugna.

find .  -name "*.groovy" -not -path "./target/*" -print

troverà i file groovy non nel percorso della directory di destinazione.


3

Per risolvere questo problema, puoi semplicemente usare questa condizione di ricerca:

find \( -name 'messages.*' ! -path "*/.svn/*" \) -exec grep -Iw uint {} +

Puoi aggiungere altre restrizioni come questa:

find \( -name 'messages.*' ! -path "*/.svn/*" ! -path "*/CVS/*" \) -exec grep -Iw uint {} +

Ulteriori informazioni al riguardo sono disponibili nella sezione della pagina man "Operatori": http://unixhelp.ed.ac.uk/CGI/man-cgi?find


3

Nota che se lo fai

find . -type f -name 'messages.*'

allora -printè implicito quando l'intera espressione ( -type f -name 'messages.*') è vera, perché non c'è 'azione' (come -exec).

Mentre, per smettere di scendere in certe directory, dovresti usare tutto ciò che corrisponde a quelle directory e seguirlo -prune(che intende smettere di scendere in directory); così:

find . -type d -name '.svn' -prune

Questo vale su True per le directory .svn e possiamo usare un cortocircuito booleano seguendo questo da -o(OR), dopodiché ciò che segue dopo -oviene verificato solo quando la prima parte è False, quindi non è una directory .svn. In altre parole, quanto segue:

find . -type d -name '.svn' -prune -o -name 'message.*' -exec grep -Iw uint {}

valuterà solo ciò che è giusto -o, vale a dire -name 'message.*' -exec grep -Iw uint {}, per i file NON all'interno delle directory .svn.

Si noti che poiché .svnè probabilmente sempre una directory (e non ad esempio un file), e in questo caso certamente non corrisponde al nome 'message. *', Si potrebbe anche tralasciare -type de fare:

find . -name '.svn' -prune -o -name 'message.*' -exec grep -Iw uint {}

Infine, nota che se ometti qualsiasi azione ( -execè un'azione), dì così:

find . -name '.svn' -prune -o -name 'message.*'

allora l' -printazione è implicita ma si applicherà all'intera espressione, inclusa la -name '.svn' -prune -oparte e quindi stampa tutte le directory .svn così come i file 'message. *', che probabilmente non è quello che vuoi. Pertanto, quando si utilizza -prunein questo modo, è sempre necessario utilizzare un '"azione" nella parte destra dell'espressione booleana . E quando quell'azione sta stampando devi aggiungerla esplicitamente, in questo modo:

find . -name '.svn' -prune -o -name 'message.*' -print


2

Prova findrepo che è un semplice wrapper per find / grep e molto più veloce di ack. In questo caso lo useresti come:

findrepo uint 'messages.*'

2

wcfind è uno script find wrapper che uso per rimuovere automagicamente le directory .svn.


1

Questo funziona per me nel prompt di Unix

gfind. \ (-not -wholename '* \. svn *' \) -type f -name 'messaggi. *' -exec grep -Iw uint {} +

Il comando sopra elencherà i FILE che non sono con .svn e eseguiranno il grep che hai citato.


'gfind' è un refuso? Non ce l'ho su Ubuntu 14.04.
Jonathan Hartley,

Supponendo che volessi dire "trova", questo non funziona del tutto. Filtra anche i file come xxx.svnxxx. Questo è importante - ad esempio se stai usando git invece di svn, spesso vorrai includere file come .gitignore (che non sono metadati, è un file normale incluso nel repository) nei risultati di find.
Jonathan Hartley,

1

di solito installo l'output attraverso grep ancora una volta rimuovendo .svn, nel mio uso non è molto più lento. esempio tipico:

find -name 'messages.*' -exec grep -Iw uint {} + | grep -Ev '.svn|.git|.anythingElseIwannaIgnore'

O

find . -type f -print0 | xargs -0 egrep messages. | grep -Ev '.svn|.git|.anythingElseIwannaIgnore'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.